티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/59413
어제 해결못했던 문제. 복습하려고 강의를 찾아봐도 MySQL 수업에서 SET를 배운적이 없었다.
https://three-pleasure.tistory.com/256
[삼쾌한 IT강의] MySQL 변수 종류 및 사용법
안녕하세요! 삼쾌한 IT강의 백소라강사 입니다. 아래와 같이 MySQL 의 변수 종류와 사용법을 정리했습니다. 1. 사용자 정의 변수 1-1. 사용자 정의 변수 선언 및 초기화 SET @변수이름 = 대입값;
three-pleasure.tistory.com
여기서 SET를 어떻게 쓰는지 알게됨. 다른사람이 SET로 짠 코드를 보며 해석하기로함
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;
여기서 set @hour는 hour라는 변수를 만든다는 것이고, := -1; 은 hour가 -1이라는 뜻이다. 끝에 ;를 빼먹으면 오류가난다. (hour = -1)
SELECT문에 HOUR라는 이름으로 들어갈 컬럼은 @hour가 1씩 증가한다. 즉 -1로 set해줬던 @hour는 0,1,2,3,4,5,6...으로 증가하며 row를 만든다. 끝에 WHERE절에 @hour가 <23 조건을 붙여서 23까지만 출력되게 한다.
SELECT문의 두번째는 (SELECT문에서 HOUR(DATETIME) = @hour 인 row들을 COUNT한다)
그렇게 완성되었다.
MySQL에서 SET를 처음써봐서 낯설지만 코딩을했던 경험을 살려 규칙을 파악하면 생각보다 복잡하지 않았다.
이름이 입력안된, 즉 이름이 NULL인 녀석의 animal_id를 출력하는 문제
이전 문제의 반대로 NULL이 아닌 row들을 출력하게 하는 문제
이젠 NULL값일때 따로 No name이 출력되게 지정해주고, ANIMAL_TYPE, NAME, SEX_UPON_INTAKE 컬럼을 ANIMAL_ID순으로 나타나게 하는 문제.
SELECT 문에서 COALESCE(name, 'No name')을 해주면 name 컬럼이 출력될때 NULL이 아닌 데이터는 그대로 출력되고 NULL인경우 No name으로 바뀌어서 출력되게 된다.
마지막에 ASC;를 넣어주면 더 확실하긴 할 것 같다.
animal_outs 기준으로 있어야 할 animal_id가 animal_ins에 없는 유실된 row 찾기.
animal_outs를 기준으로 outer_join을 해주었고, 조건식인 ON 을 활용하여 id를 기준으로 합쳐주었다.
여기서 NULL 인 데이터들이 유실된 데이터인데, WHERE 과 IS NULL을 활용하여 해당 animal_id를 찾음
마찬가지로 JOIN 문제. 이번엔 보호시작일인 ins의 datetime보다 입양일인 outs의 datetime이 더 빠르게 설정된 경우, 즉 잘못 입력된 row를 찾는 문제. JOIN한 후에 WHERE문에 조건을 걸어서 해결
입양을 못간 동물들 중 가장 오래된 순으로 3개의 row를 출력하는 문제.
입양을 못간 동물들이라는것은 ins에는 데이터가 있으나 outs에는 데이터가 없는(NULL)경우이다.
JOIN후에 outs.datetime이 NULL인 애들을 날짜순으로 정렬한 후에 3마리까지만 보이게 해주었다.
SELECT
outs.animal_id AS animal_id,
outs.animal_type AS animal_type,
outs.name AS name
FROM animal_ins AS ins JOIN animal_outs AS outs
ON ins.animal_id = outs.animal_id
WHERE SUBSTRING(ins.sex_upon_intake,1,6) = 'Intact'
AND (SUBSTRING(outs.sex_upon_outcome,1,8)='Neutered' OR SUBSTRING(outs.sex_upon_outcome,1,6)='Spayed')
들어올 당시엔 중성화가 아니었지만 (Intact) 나갈땐 중성화를 해서 나간 동물들 찾기 (Neutered 혹은 Spayed)
id기준으로 JOIN해주고 ins 테이블은 조건에 앞 6글자가 Intact이면서, out 테이블은 앞 8글자가 Neutered 이거나 6글자가 Spayed인경우로조건을지정해줌
특정 이름을 가진 row의 id, name, 중성화 여부를 보는 문제. IN을 써서 해결
animal_type이 Dog 이면서 name에 EL이 포함된 row찾기. LIKE "%EL%"를 써서 EL이 들어간 데이터를 찾아줌
중성화 여부를 판단하여 O아니면 X로 표시하게하는 조건
IF문을 이용하였다. IF(조건,True,False)
보호기간이 가장 길었던 동물의 ID와 NAME 칼럼을 상위 2개만 얻는 문제
outs 테이블이 NULL이면 아직 보호중인 동물이므로 그냥 빼줬다.
MySQL은 날짜의 덧셈 뺄셈이 지원된다. 그래서 outs.datetime - ins.datetime 으로 보호기간을 얻을 수 있었고 그것을 상위부터 노출하기 위해 내림차순인 DESC를 써서 정렬 후 LIMIT 2 로 2개만 불러왔다.
드디어 프로그래머스의 SQL 고득점 Kit의 마지막 문제로 왔다.
DATE형 변환에 관련된 문제였고, date_format을 이용하여 해결했다. 만세
'Python > MYSQL' 카테고리의 다른 글
[MySQL] 프로그래머스 SQL 고득점 Kit 문제 후기 (0) | 2020.08.13 |
---|---|
[MySQL] 프로그래머스 SQL 고득점 Kit 문제 정복하기 - 01 (0) | 2020.08.12 |
- Total
- Today
- Yesterday
- Vue.js 프로젝트 투입 일주일 전
- vue.js 개념
- 부트스트랩 커스텀
- dict 연속성
- Python
- 코드잇 강의
- bootstrap5
- Vue.js강의
- MySQL 문제
- 배열 특정객체 제거
- Vue.js 입문
- heap max
- 프로그래머스 코딩테스트
- chmod 400
- vue bootstrap scss
- windows10 chmod 400
- javascript 객체배열
- 다리위를지나는트럭
- 프로그래머스
- 코딩테스트
- Vue.js 책
- 입문
- 윈도우 chmod
- 파이썬
- vue.js 특징
- JavaScript
- 배열 특정요소 제거
- Java수료
- 데이터 사이언스 프로그래밍 파이썬
- Vue.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |