SQL에 대한 밍기적1

Posted by : at

Category : Data_Engineering


SQL

 

Structured Query Language의 약자로 시스템에서 자료를 처리할 때 사용하는 데이터 질의 언어이다.

오늘은 그 중에서도 MySQLSELECT라는 명령어를 알아보겠다.

 

SELECT field1, field2, ... FROM table {WHERE 조건};

 

간단히 문제를 풀면서 설명해 보겠다. (파란색 글씨를 누르면 문제가 나와용~)

ANIMAL_INS라는 테이블이 존재하고 INTAKE_CONDITIONSick인 동물을 SELECT하는 것이 목표이다.

풀이는 다음과 같다.

 

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID;

 

여기서 ORDER BYANIMAL_ID를 기준으로 오름차순으로 정렬해서 보여주겠다는 의미이다. 만약 내림차순으로 정렬하기

원한다면 제일 뒤에 DESC를 붙여주면 된다. ORDER BY도 마찬가지로 여러 인자가 들어갈 수 있다. 위의 문제로 예를 들면,

 

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID ASC, NAME DESC;

 

위와 같은 표현도 가능하다. 또 아프지 않은 동물을 찾기 원한다면 WHERE 뒤에 INTAKE_CONDITION != ‘Sick’로

변경하면 된다.

SELECT의 기본적인 사용법을 알았으니 조금 심화단계로 나아가보자!!(할수 있뜨아~)

 

이번엔 COUNTDISTINCT에 대해 알아보자. COUNT는 이름 그래도 갯수를 세어주는 역할을 한다.

그렇다면 DISTINCT는 무엇일까? 여기서 예제를 살펴보자

ANIMAL_INS라는 테이블에서 NULL을 제외한 중복되지 않는 동물의 이름의 갯수를 세어주어야 한다. 이 때 중복을 피하기 위해

사용하는 것이 DISTINCT이다. (COUNTCOLUMN값을 넣을 경우 COUNT는 자동으로 NULL을 제외하고 갯수를 센다.) 이제 정답을 보자!

 

SELECT COUNT(DISTINCT(NAME)) AS count FROM ANIMAL_INS 

 

조~금만 더 복잡한 것을 배워보겠다. 잠시 가계부를 생각해보자. 부지런한 당신은 매일 사용한 금액을 적어놓았는데 갑자기(?) 월별로 사용한

금액의 합이 궁금해졌다. 이럴 때 사용하는 것이 바로 GROUP BY이다. GROUP BY는 데이터들을 원하는 그룹으로 나눌 때 사용된다.

가계부에서 월을 기준으로 SUM(사용한 돈)을 GROUP 지을 수 있다. 그런데 GROUP BY의 데이터에서 조건을 주고 싶어질 수 있다.

바로 다음과 같은 경우이다. ANIMAL_INS라는 테이블에서 09:00~19:59 사이에 데이터의 분포도를 알고 싶다.

SELECTWHERE이 있다면 GROUP BY에는 HAVING이 있다. HAVING절에서 원하는 조건을 넣어보자.

 

SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR HAVING HOUR BETWEEN 9 AND 19 ORDER BY HOUR

 

여기서 잠깐 TMI)

ASALIAS로 별칭을 주는 것이다. (쉽게 말해 매번 쓰기 귀찮으니까 짧게 부르려는 귀찮이즘…)

BETWEEN을 모르면 HAVING HOUR>=9 AND HOUR<=19로 작성해도 문제 없다. (근데 BETWEEN쓰면 있어보이니까…)

 

이제 거의 다 왔다. 보통 이렇게 말하면 거짓말인데 진짜다. 마지막으로 JOIN에 대해 알아보겠다.

JOIN은 두 테이블을 합쳐서 결과를 도출할 때 사용된다. 만약 코딩테스트를 준비하는 사람이라면 JOIN까지는

자유자재로 구사할 수 있어야한다. 오늘은 LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN 이렇게 3가지 JOIN만 알아볼 것이다.

어렵게 생각할 것 없다. INNER JOIN은 교집합을 생각하면 된다. 간단히 예제를 살펴보자

ANIMAL_INSANIMAL_OUTS에 동시에 존재하는 동물 중에 성별이 변화한 녀석을 찾으면 되는 문제이다.

 

SELECT AO.ANIMAL_ID, AO.ANIMAL_TYPE, AO.NAME
FROM ANIMAL_INS AS AI JOIN ANIMAL_OUTS AS AO ON (AI.ANIMAL_ID=AO.ANIMAL_ID and AI.SEX_UPON_INTAKE != AO.SEX_UPON_OUTCOME)
ORDER BY AO.ANIMAL_ID

 

JOIN을 할 경우 ANIMAL_INS에도 NAME이라는 COLUMN이 있고 ANIMAL_OUTS에도 NAME이라는 COLUMN이 있다. 그냥 NAME만 적어놓으면

어느 쪽 데이터를 표시하는지 알 수 없으므로 AI.NAME과 같이 테이블 이름을 앞에 붙여주자!

 

이제 OUTER JOIN에 대해 알아보자. LEFT OUTER JOIN은 왼쪽 테이블에 오른쪽 테이블을 붙이는 것이다.

단! 왼쪽 테이블에 없는 오른쪽 테이블의 데이터는 붙이지 않는다.

저게 뭔 소리지…(본인의 말솜씨에 당황하는 중)

A테이블     B테이블  
이름 성취도   이름 성적
A 85%   A 55점
B 90%   C 95점
C 10%   E 75점
D 25%   G 0점
E 95%   I 35점
F 5%   K 15점
G 0%   M 40점

 

여기서 A LEFT OUTER JOIN B 하게 되면 다음과 같다.

A테이블 JOIN B테이블    
이름 성취도 성적
A 85% 55점
B 90% NULL
C 10% 95점
D 25% NULL
E 95% 75점
F 5% NULL
G 0% 0점

 

혹시라도 이해 안 되었다면 질문해주기 바란다. 이제 예제를 살펴보자.

입양간 기록(ANIMAL_INS)은 있는데 보호소에 들어온 기록(ANIMAL_OUTS)이 없는 동물을 찾는 문제이다.

ANIMAL_OUTSANIMAL_INSLEFT OUTER JOIN하게 되면 ANIMAL_OUTS에 있고 ANIMAL_INS에 없는 데이터의

ANIMAL_INS.ANIMAL_ID에는 NULL값이 들어가 있을 것이다.

 

SELECT AO.ANIMAL_ID , AO.NAME FROM ANIMAL_OUTS AS AO LEFT JOIN ANIMAL_INS AS AI ON (AI.ANIMAL_ID = AO.ANIMAL_ID AND AI.ANIMAL_TYPE = AO.ANIMAL_TYPE)
WHERE AI.ANIMAL_ID is NULL ORDER BY AO.ANIMAL_ID

 

부족한 설명이나 잘못된 부분을 지적해주시면 최대한 빨리 반영하도록 하겠습니당~

읽어주셔서 감사합니다. 다음에 더 좋은 밍기적으로 찾아뵐게염>_<

 


End


About GJ

안녕하세요 방문해주셔서 감사합니다. 혹시 보시면서 궁금하신것 있으시면 https://open.kakao.com/o/sivaz71c로 연락주세용~

Star
Useful Links