SQL
Structured Query Language
의 약자로 시스템에서 자료를 처리할 때 사용하는 데이터 질의 언어이다.
오늘은 그 중에서도 MySQL
의 SELECT
라는 명령어를 알아보겠다.
SELECT field1, field2, ... FROM table {WHERE 조건};
간단히 문제를 풀면서 설명해 보겠다. (파란색 글씨를 누르면 문제가 나와용~)
ANIMAL_INS
라는 테이블이 존재하고 INTAKE_CONDITION
이 Sick
인 동물을 SELECT
하는 것이 목표이다.
풀이는 다음과 같다.
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID;
여기서 ORDER BY
는 ANIMAL_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
의 기본적인 사용법을 알았으니 조금 심화단계로 나아가보자!!(할수 있뜨아~)
이번엔 COUNT
와 DISTINCT
에 대해 알아보자. COUNT
는 이름 그래도 갯수를 세어주는 역할을 한다.
그렇다면 DISTINCT
는 무엇일까? 여기서 예제를 살펴보자
ANIMAL_INS
라는 테이블에서 NULL
을 제외한 중복되지 않는 동물의 이름의 갯수를 세어주어야 한다. 이 때 중복을 피하기 위해
사용하는 것이 DISTINCT
이다. (COUNT
에 COLUMN
값을 넣을 경우 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 사이에 데이터의 분포도를 알고 싶다.
SELECT
에 WHERE
이 있다면 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)
AS
는 ALIAS
로 별칭을 주는 것이다. (쉽게 말해 매번 쓰기 귀찮으니까 짧게 부르려는 귀찮이즘…)
BETWEEN
을 모르면 HAVING HOUR>=9 AND HOUR<=19로 작성해도 문제 없다. (근데 BETWEEN쓰면 있어보이니까…)
이제 거의 다 왔다. 보통 이렇게 말하면 거짓말인데 진짜
다. 마지막으로 JOIN
에 대해 알아보겠다.
JOIN
은 두 테이블을 합쳐서 결과를 도출할 때 사용된다. 만약 코딩테스트를 준비하는 사람이라면 JOIN
까지는
자유자재로 구사할 수 있어야한다. 오늘은 LEFT OUTER JOIN
, RIGHT OUTER JOIN
, INNER JOIN
이렇게 3가지 JOIN
만 알아볼 것이다.
어렵게 생각할 것 없다. INNER JOIN
은 교집합을 생각하면 된다. 간단히 예제를 살펴보자
ANIMAL_INS
와 ANIMAL_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_OUTS
와 ANIMAL_INS
를 LEFT 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
부족한 설명이나 잘못된 부분을 지적해주시면 최대한 빨리 반영하도록 하겠습니당~
읽어주셔서 감사합니다. 다음에 더 좋은 밍기적으로 찾아뵐게염>_<