오늘부터 메타코드M AI 교육 플랫폼에서 무료로 강의를 수강하고,
블로그에 공부 후기를 작성하는 메타코드 서포터즈 5기를 신청하게 되었다.
메타코드는 인공지능, 데이터분석과 같은 최근 중요도가 높은 분야에 대해서
현직자 분들이나 KAIST, 서울대 박사 분들께서 직접 강의를 찍어주시고 계신다.
따라서, 실무에서 쓰이는 스킬들을 핵심만 짚어서 학습할 수 있다는 점에서 꼭 추천하고 싶다.
또한, 메타코드 회원 가입을 하면 12,000 포인트를 지급해주는데,
이 포인트를 이용해서 상시로 진행하는 이벤트에 응모할 수도 있으니 한 번 도전해보시길!
신규 개설된 유료 강의를 선착순으로 무료로 들을 수 있는 기회도 있으니 놓치지 말자!
1. Having
HAVING 절은 SQL의 GROUP BY 절과 함께 사용되며, 그룹화된 결과에 조건을 적용하는 데 사용한다.
지난 강의에서 조건을 거는 구문으로 WHERE 구문을 학습했었는데 둘의 차이를 설명하자면,
WHERE 절은 개별 테이블에 대한 조건을 적용하는 반면,
HAVING 절은 그룹화된 결과에 집계 값에 대한 조건을 적용하는 것이다.
SELECT [컬럼명]
FROM [테이블명]
WHERE [조건]
GROUP BY [조건]
HAVING [조건]
ORDER BY [조건]
항상 GROUP BY 뒤에 위치하며 GROUP BY 이후 그룹화 된 테이블에 조건을 적용하는 것으로 이해하면 쉬울 것 같다.
왼쪽의 SQL Code를 실행시켰을 때, 결과를 보면 avg(buyprice)가 50미만인 것을 알 수 있다.
해당 SQL 쿼리의 동작을 하나하나 살펴보자.
1. SELECT 구문:
SELECT productline, avg(buyprice)
먼저 'productline'과 'avg(buyprice)'를 선택한다. 이때, productline은 products 테이블에서 상품 라인을 나타내는 열이며, avg(buyprice)는 각 상품 라인의 평균 구매 가격을 나타낸다.
2. FROM 절:
FROM products
다음으로, 'products' 테이블에서 데이터를 가져오는데,
이 테이블은 상품 정보를 포함하고 있으며, 각 상품은 특정 상품 라인에 속한다.
3. GROUP BY 구문:
GROUP BY productline
GROUP BY 문을 통해 'productline' 컬럼을 기준으로 그룹화한다.
즉, 동일한 상품 라인에 속하는 상품들을 하나의 그룹으로 묶는 것!
4. HAVING 구문:
HAVING AVG(BUYPRICE) < 50;
'AVG(BUYPRICE) < 50' 조건을 적용하여,
각 상품 라인의 평균 구매 가격이 50미만인 경우에 해당하는 그룹만을 결과로 반환하도록 필터링하는 역할을 한다.
2. IF/CASE 구문
2.1 IF 문
IF 문은 간단한 조건을 처리하는 데 주로 사용하는 구문으로, 주어진 조건이 참 또는 거짓인 경우에만 처리한다.
예를 들어, "만약 A가 참이면 B를 수행하고, 그렇지 않으면 C를 수행"과 같은 타 프로그래밍 언어에서의 쓰임과 동일!
IF(condition , value_if_true, value_if_false)
다음 예시를 통해 이해해보자
위에서와 마찬가지로 하나하나 코드를 뜯어보면,
1. SELECT 구문:
SELECT checkNumber, amount, IF(amount > 50000, 'Large', 'Small') AS orderSize
먼저, checkNumber, amount, 그리고 IF(amount > 50000, 'Large', 'Small') AS orderSize를 선택한다.
여기서 checkNumber는 결제의 체크 번호를 나타내며, amount는 결제 금액을 나타낸다.
이때, IF(amount > 50000, 'Large', 'Small') AS orderSize는 결제 금액이 50000을 초과하는 경우 'Large'를,
그렇지 않은 경우 'Small'을 반환하고, 이 값을 orderSize라는 별칭(alias)으로 지정한다는 의미이다.
2. FROM 절:
FROM payments;
다음으로, 'payments' 테이블에서 데이터를 가져오는데, 이 테이블은 결제 정보를 포함하고 있다.
2.2 CASE 문
CASE 문은 여러 조건을 테스트 하고 여러 결과 중 하나를 반환한다.
C언어의 Switch문과 동일한 기능인 것 같은데?
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE result
END as ~
CASE 문도 예시로 살펴보자.
1. SELECT 구문:
SELECT productName, buyPrice, CASE
CASE 문을 사용하여 구매 가격에 따라 'Cheap', 'Moderate', 또는 'Expensive'로 분류된 값을
priceCategory라는 별칭으로 반환한다.
2. CASE 문:
CASE
WHEN buyPrice < 20 THEN 'Cheap'
WHEN buyPrice BETWEEN 20 AND 50 THEN 'Moderate'
ELSE 'Expensive'
END AS priceCategory
FROM products;
코드가 약간 복잡하긴 하지만 그리 어렵지 않다.
다음 순서로 진행됨을 이해해보자
1. WHEN buyPrice < 20 THEN 'Cheap': 구매 가격이 20보다 작으면 'Cheap'을 반환
2. WHEN buyPrice BETWEEN 20 AND 50 THEN 'Moderate': 구매 가격이 20과 50 사이(포함)면 'Moderate'을 반환
3. ELSE 'Expensive': 위의 조건을 모두 만족하지 않으면 'Expensive'를 반환
즉, 구매 가격이 50보다 큰 경우 'Expensive'를 반환
4. END AS priceCategory: 이 CASE 문에서 반환된 값을 priceCategory라는 열 이름으로 지정
3. JOIN 구문
SQL의 JOIN 구문은 두 개 이상의 테이블을 결합하여 데이터를 조회할 때 사용된다.
JOIN의 종류와 각 종류의 사용 방법에 대해서 알아보면,
3.1 INNER JOIN
INNER JOIN은 두 테이블에서 조건에 맞는 데이터만 조회하는 것으로,
교집합이라고 생각하면 이해가 쉽다!
SELECT A.column1, B.column2
FROM TableA A
INNER JOIN TableB B
ON A.common_column = B.common_column;
위의 예제 Code에서는 'TableA'와 'TableB'의 'common_column'이 일치하는 행만 조회된다.
3.2 LEFT JOIN (또는 LEFT OUTER JOIN)
LEFT JOIN은 왼쪽 테이블의 모든 행을 포함하고, 오른쪽 테이블에서 일치하는 데이터가 있으면 결합하고,
일치하지 않으면 NULL 값을 반환한다.
SELECT A.column1, B.column2
FROM TableA A
LEFT JOIN TableB B
ON A.common_column = B.common_column;
이 경우 'TableA'의 모든 행이 포함되며, 'TableB'에서 일치하지 않는 데이터는 NULL로 표시된다.
다음 예제를 살펴보자.
주어진 SQL 쿼리는 두 테이블 'ex3'와 'ex4'를 LEFT JOIN을 사용하여 결합한 후,
WHERE문을 이용하여 'ex4'의 'id' 값이 NULL인 행을 선택하는 쿼리이다.
각 테이블을 살펴보면서 동작 원리를 살펴보자.
ex3 테이블
id | NAME | age |
1 | 김상훈 | 25 |
2 | 박상훈 | 30 |
3 | 최상훈 | 20 |
ex4 테이블
id | region |
1 | 서울 |
4 | 부산 |
JOIN 및 필터링 과정
1. LEFT JOIN 수행:
id | NAME | age | id | region |
1 | 김상훈 | 25 | 1 | 서울 |
2 | 박상훈 | 30 | NULL | NULL |
3 | 최상훈 | 20 | NULL | NULL |
먼저, 'ex3' 테이블의 모든 행을 포함하고, 'ex4' 테이블에서 일치하는 'id'가 있으면 해당 열을 결합한다.
일치하는 행이 없으면 'ex4'의 열은 NULL이 된다.
2. WHERE ex4.id IS NULL 필터 적용:
id | NAME | age | id | region |
2 | 박상훈 | 30 | NULL | NULL |
3 | 최상훈 | 20 | NULL | NULL |
LEFT JOIN 결과에서 'ex4'의 'id'가 NULL인 행만 선택한다. 이는 'ex3'에는 있지만 'ex4'에는 없는 'id'를 의미하는 것!
3.3 RIGHT JOIN (또는 RIGHT OUTER JOIN)
RIGHT JOIN은 LEFT JOIN의 반대 개념이라고 생각하면 쉽다.
오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에서 일치하는 데이터가 있으면 결합하고,
일치하지 않으면 NULL 값을 반환한다.
SELECT A.column1, B.column2
FROM TableA A
RIGHT JOIN TableB B
ON A.common_column = B.common_column;
이 경우 'TableB'의 모든 행이 포함되며, 'TableA'에서 일치하지 않는 데이터는 NULL로 표시된다.
3.4 UNION
UNION은 두 테이블의 데이터를 세로로 쭉 나열하는 역할을 한다.
이때, COLUMN의 수가 같아야 하며, 중복은 제거한다.
즉, 합집합 개념과 동일 하다는 것!
만약, 중복 행을 그대로 표시하고 싶다면, UNION ALL을 사용하여 그대로 표시하면 된다.
3.4 FULL JOIN (또는 FULL OUTER JOIN)
RIGHT JOIN은 오른쪽 테이블의 모든 행을 포함하고, 왼쪽 테이블에서 일치하는 데이터가 있으면 결합하고,
일치하지 않으면 NULL 값을 반환한다.
SELECT A.column1, B.column2
FROM TableA A
FULL OUTER JOIN TableB B
ON A.common_column = B.common_column;
이 경우 'TableA'와 'TableB'의 모든 행이 포함되며, 일치하지 않는 데이터는 NULL로 표시된다.
오늘 강의 후기
드디어 SQL에서 가장 중요한 개념 중 하나인 JOIN 구문을 배웠는데,
뭔가 기존에 책으로 공부하던 것보다 핵심만 딱 요약해서 설명해주시는 느낌이라서
공부하는 데도 지루하지 않고 조금 더 내용적으로도 잘 이해되는 것 같다.
앞으로 강의와 실습을 바탕으로 SQL 마스터 해보자 ,,
해당 강의를 들을 지 말지 고민말고 한 번 들어보시길!
이상훈 강사님의 데이터분석가 입문 필수 SQL 부트캠프
데이터 분석가 공부를 시작하려는 학생들에게 강추합니다!
* 서포터즈 지원을 받아 작성하였습니다
'Portfolio > 메타코드M 서포터즈 5기' 카테고리의 다른 글
[메타코드 강의 후기] 서브쿼리 & CTE (0) | 2024.07.21 |
---|---|
[메타코드 강의 후기] WINDOW 함수 (0) | 2024.07.14 |
[메타코드 강의 후기] SQL 부트캠프 | WHERE & ORDER BY & GROUP BY (0) | 2024.06.30 |
[메타코드 강의 후기] SQL 부트캠프 | DataType & Table 생성 (4) | 2024.06.23 |
[메타코드 강의 후기] SQL 부트캠프 | 데이터베이스란? (1) | 2024.06.16 |