-
프로그래머스[SQL 잡히는대로 다풀기] - 없어진 기록 찾기, 있었는데요 없었습니다., 오랜 기간 보호한 동물(1), 보호소에서 중성화한 동물, 루시와 엘라 찾기, 이름에 el들어가는 동물 찾기, 중..Database 2021. 8. 6. 15:05728x90반응형
없어진 기록 찾기
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59042
문제 내용 : 천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
풀이 :
- 보호소에 들어온 기록이 없다면 둘이 조인을 할때, OUTER JOIN을 쓰면 한쪽이 빌 것이다. 그래서 입양을 간 기록을 기준으로 JOIN을 시켜주면 보호소엥 들어온 기록은 없는 부분이 생길 것이다.
- ON 조건 : 조인을 할때 어떤 컬럼으로 해줄 것인가를 설정해줘야 한다.
- 보호소에 들어온 기록이 없는 → DATETIME is null
-- 코드를 입력하세요 SELECT B.ANIMAL_ID as ANIMAL_ID, B.NAME as NAME from ANIMAL_INS as A right outer join ANIMAL_OUTS as B on A.ANIMAL_ID = B.ANIMAL_ID where A.DATETIME is null
있었는데요 없었습니다.
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59043
문제 내용 : 관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
풀이 :
- 두 테이블에서 날짜를 비교할때, DATETIME 같은 경우 그냥 대소비교로 크기 비교가 가능하다.
- 날짜로 정렬
-- 코드를 입력하세요 SELECT A.ANIMAL_ID as ANIMAL_ID, A.NAME as NAME FROM ANIMAL_INS as A, ANIMAL_OUTS as B WHERE A.ANIMAL_ID = B.ANIMAL_ID and A.DATETIME > B.DATETIME order by A.DATETIME
오랜 기간 보호한 동물(1)
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59044
문제 내용 : 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
풀이 :
- 맨위에와 거꾸로 Left Outer Join을 해주면 된다.
-- 코드를 입력하세요 SELECT A.NAME as NAME, A.DATETIME as DATETIME from ANIMAL_INS as A left outer join ANIMAL_OUTS as B on A.ANIMAL_ID = B.ANIMAL_ID where B.DATETIME is null order by A.DATETIME limit 3
보호소에서 중성화한 동물
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59045
문제 내용 : 보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
풀이 :
- 아마 중성화를 거치면 들어올때랑 나갈때가 다를 것이다. 그렇기 때문에 조건만 잘 걸어주면 된다.
-- 코드를 입력하세요 SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME FROM ANIMAL_INS as A, ANIMAL_OUTS as B WHERE A.ANIMAL_ID = B.ANIMAL_ID and B.SEX_UPON_OUTCOME != A.SEX_UPON_INTAKE order by A.ANIMAL_ID
루시와 엘라 찾기
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59046
문제 내용 : 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.
풀이 :
- 여러개의 문자열에 속하는지 직접 비교하기 위해서 그냥 IN으로 써주면 된다.
-- 코드를 입력하세요 SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS WHERE NAME in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
이름에 el이 들어가는 동물 찾기
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59047
문제 내용 : 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
풀이 :
- 문자열을 비교할때 % 연산을 쓴다. MYSQL 의 SQL문법같은 경우는 대소문자를 신경안쓰고 다처리해준다.
- 대문자로만 하고싶다면? → UPPER(NAME) LIKE UPPER('%el%')
- 소문자로만 하고싶다면? → LOWER(NAME) LIKE LOWER('%el%')
- '개'만 뽑는다는게 함정! 글 끝까지 읽자~
-- 코드를 입력하세요 SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE NAME like '%el%' and ANIMAL_TYPE = 'Dog' ORDER BY NAME
중성화 여부 파악하기
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59409
문제 내용 : 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
풀이 :
- CASE 문을 시작으로 조건문을 알린다. WHEN 조건 참이면(THEN) ~ ELSE(아니면) ~ END로 끝내기
- IF(조건 REGEXP, 참, 거짓) → 처음알았다.
- like 와 in 을 한번에 쓸 수 있다고 한다.(LIKE '안녕%' OR data LIKE '하이%' = REGEXP ('^안녕|^하이')
- 정 생각이 안나면 테이블 잘라서 붙힌다.
1. CASE WHEN - THEN - ELSE - END 구문활용 SELECT ANIMAL_ID, NAME, CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O' ELSE 'X' END AS '중성화' FROM ANIMAL_INS =========================================================================== 2. IF(조건, 참, 거짓) 이용. SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE REGEXP 'Neutered|Spayed', 'O' , 'X') AS 중성화 FROM ANIMAL_INS =========================================================================== 3. 둘다 생각 안날때, 두개 테이블에서 각각 맞춰서 UNION으로 연결시킨다. SELECT ANIMAL_ID, NAME, 중성화 FROM( SELECT A.ANIMAL_ID, A.NAME , 'X' as 중성화 FROM ANIMAL_INS as A WHERE A.SEX_UPON_INTAKE not like '%Neutered%' and A.SEX_UPON_INTAKE not like '%Spayed%' UNION SELECT B.ANIMAL_ID, B.NAME, 'O' as 중성화 FROM ANIMAL_INS as B WHERE B.SEX_UPON_INTAKE like 'Neutered%' or B.SEX_UPON_INTAKE like 'Spayed%') as C order by ANIMAL_ID
오랜 기간 보호한 동물(2)
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59411
문제 내용 : 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.
풀이 :
- 보호 기간 = 입양 나간 날짜 - 보호소 들어온 날짜 → 이 기간이 가장 긴 2개
- 그래서 날짜의 차이만큼 정렬해서 내림차순
- limit으로 2개만
SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_INS as A, ANIMAL_OUTS as B WHERE not B.DATETIME is null and A.ANIMAL_ID = B.ANIMAL_ID order by (B.DATETIME - A.DATETIME) desc limit 2
DATETIME에서 DATE로 형 변환
문제 url : https://programmers.co.kr/learn/courses/30/lessons/59414
문제 내용 : ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.
풀이 :
- DATETIME → 년도, 월, 날짜, 시, 분, 초
- YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
- DATETIME 형 변환 → DATE_FORMAT(날짜형, '%Y-%m-%d %h:%i:%s')
- Y : 2021, y : 21
- M : JULY, m : 07
- D : 27th, d : 27
- 현재시간 : now()함수
-- 코드를 입력하세요 SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as 날짜 FROM ANIMAL_INS
헤비 유저가 소유한 장소
문제 url : https://programmers.co.kr/learn/courses/30/lessons/77487
문제 내용 : 이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.
풀이 :
- 서브 쿼리 문제이다. 하위 쿼리를 하나 만들고 해당하는 HOST_ID에 맞는 모든 컬럼을 뽑으면 된다.
-- 코드를 입력하세요 #HOST_ID가 여러개인 사람들 SELECT A.ID as ID, A.NAME as NAME, A.HOST_ID as HOIST_ID FROM PLACES as A WHERE A.HOST_ID in (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING count(HOST_ID) > 1)
우유와 요거트가 담긴 장바구니
문제 url : https://programmers.co.kr/learn/courses/30/lessons/62284
문제 내용 : 데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
풀이 :
- 두 테이블을 조인해서 조건에 맞는 것들을 찾는다.
- 중복을 없애준다.
-- 코드를 입력하세요 SELECT distinct(A.CART_ID) FROM CART_PRODUCTS as A, CART_PRODUCTS as B WHERE A.CART_ID = B.CART_ID and A.NAME = 'Yogurt' and B.NAME = 'Milk' ORDER BY A.CART_ID
SQL 문제 다 풀었다! 3일컷🤩
반응형'Database' 카테고리의 다른 글