4일차에 걸쳐 프로그래머스에 있는 SQL문제를 다 풀고 그 다음부터는 leetcode 데이터베이스 문제를 접근하고자 한다.
필자는 풀면서 처음에 생각했던 부분과 더나아가 효율적으로 작성할 수 있는 방법이 있는지 생각하면서 접근하고자 한다.
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLE
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. 아픈 동물 찾기
여기서 핵심으로 봐야할 곳은 INTAKE_CONDITION 속성이다 여기서 Sick 값을 가지고 있는 데이터만 출력해야한다 따라서 Where절을 이용하여 접근할 수 있다.
SELECT ANIMAL_ID , NAME from Animal_ins where intake_condition='Sick';
또는 조건절을 like 명령어로 작성할 수 도 있다.
where intake_condition not like '%Si%'; 로도 표현 가능하다.
2. 어린 동물 찾기
테이블 구성은 1번문제와 동일하다. 처음에는 DateTime을 보고 나타내는 줄 알았다
하지만 테이블에는 4개의 레코드 데이터들이 있지만 출력된 것은 3개의 레코드들이다.
테이블 속성 중 INTAKE_CONDITION에 Aged 레코드를 보면서 이 값을 제외한 나머지를 출력해야함을 알았다.
SELECT Animal_id , name from animal_ins where intake_condition !='Aged' order by Animal_id asc; 로 표현할 수 있다. 마지막 order by ## asc; 부분에서 asc 오름차순은 default value로 적용되어있기에 생략해도 문제는 없다.
3.이름에 el이 들어가는 동물 찾기
이 문제에서는 위에서 상술한 내용에서 할머니께서 EL로 시작하는 강아지를 찾으려고 한다고 하고 이름순으로 정렬하여 한다 따라서 이 문제에서는 LIKE 명령어를 사용해야한다.
SELECT ANIMAL_ID , name from animal_ins
where upper(name) like '%EL%' and ANIMAL_TYPE='Dog'
order by name asc;
여기서 upper 명령어를 쓴이유는 필자가 임의로 작성한 내용이다. lower명령어로 수정해도 좋고 아예 안써도 무관하다.
여기서 핵심은 like 명령어에서 '%@@%' 부분이다 앞뒤로 %가 있어야 EL단어 있는것을 검색하기 때문이다.
4. 중성화 여부
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
이 문제는 우선 출력한 부분에서 중성화 라는 임의 속성을 추가하였다. 또한 중성화 부분을 체크하기 위해서는 SEX_UPON_INTAKE 속성을 통한 조건문을 사용해야 한다.
이 문제를 해결하기 위해서는 기존 프로그래밍에 있던 switch case문처럼 case문을 사용해도 되고 if절을 사용해도 좋다 필자는 case문을 사용하여 문제를 접근하였다
SELECT animal_id , name, case when sex_upon_intake like 'I%' then 'X' else 'O' end as '중성화' from animal_ins order by animal_id;
5.오랜기간 보호된 동물(2)
https://school.programmers.co.kr/learn/courses/30/lessons/59411#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 테이블이 2개로 형성된 문제이다. 맨위에 있는 보호소에 들어온 테이블과 입양간 정보가 있는 테이블 총 2개로 형성되어있다. 또한 외래키 즉 조인활용 문제로 오래 보호된 2마리를 출력하는 문제이다
우선 Join을 사용해야하고 각 테이블을 지정하여 출력하고자 하는 속성도 구분지어야한다 필자는
SELECT ao.animal_id , ao.name from animal_ins as ai join animal_outs as ao on ai.ANIMAL_ID = ao.ANIMAL_ID order by ao.DATETIME-ai.DATETIME desc limit 2;
조인을 선언후 외래키끼리 ID 동일한 것 중 입양보낸 테이블 DATETIME에서 보호소에 들어온 시간을 뺀 긴순으로 LIMIT을 활용하여 풀었다
감사합니다.
'군대 활동 > 공부' 카테고리의 다른 글
SQL공부 4일차 (0) | 2022.10.02 |
---|---|
SQL 3일차 (0) | 2022.10.01 |
leetcode 알고리즘 공부 2주차 Day 1 (0) | 2022.10.01 |
SQL 공부 1일차 (0) | 2022.09.30 |
SQLD 1차 결과 (0) | 2022.09.30 |