길었던 꿀같은 추석연휴가 지났다.
추석연휴동안 공부는 생각도 안하고 놀았으니 이제 다시 일상으로 돌아와 수업을 듣기 시작했는데,
오늘부터 배우는 내용이 국비 수업으로는 마지막 수업에 해당하는 커리큘럼이 시작되었다.
그래서 오늘 배운 SQL에 대한 간단 문법을 작성해보려한다!
내가 참고하는 교재는 SQL로 맛보는 데이터 전처리 분석(노수영 저) 이다.
이 책은 간단하게 알려주는 기초에 대해 다루고 있어서, 기본정도 아시는분들이 많이 사용하는 것으로 알고 있다.
https://product.kyobobook.co.kr/detail/S000001934242
노베이스라거나, 기초를 먼저 다지려는 분들은 좀 더 쉬운 책들을 권하나, 예시가 잘되어있어
심화로 연습하고자 하면 꼭 참고해보길 바란다.
무료로 공부하기 좋은 사이트를 아래에 참고용으로 남겨둔다.
https://www.mysqltutorial.org/
1. SQL Syntax
SQL은 데이터베이스에서 필요한 형태의 데이터를 추출하거나 가공하기 위해 사용하는 언어이다.
그 중 가장 기본적으로 꼭 알아야 할 문법을 알아보자.
SELECT : 컬럼, 계산 값
FROM : 테이블 명
WHERE : 조건
GROUP BY : 그룹화 (보통은 따로 작성함.)
HAVING : 그룹화에서 사용되는 조건
2. SELECT, FROM
SELECT 상품번호 FROM DB명.PRODUCT;
기본적인 툴은 위와 같이 사용한다.
위에서 의미하는 것을 말해주자면,
DB명은 생성된 스키마 이름, PRODUCT는 스키마 안에 있는 테이블명을 말한다.
이 테이블에 각 데이터들이 엑셀같이 정리가 되어있다.
보통 한 테이블을 지정하는 것을 FROM 에서 진행하고 전체를 모두 지정할 때는 SELECT 뒤에 *을 넣는다.
일부를 지정할 때는 해당 컬럼명을 넣고, 이 컬럼의 갯수를 알고싶다면 COUNT(컬럼명 또는 *)을 넣는다.
3. AS
SELECT 원래 컬럼명 AS 변경할 컬럼명
FROM DB명.테이블명;
AS는 특정 컬럼의 컬럼명을 변경해서 조회하도록 한다.
아래와 같이 한글로도 작성해도 변경이 된다.
4. DISTINCT
SELECT DISTINCT 제조 국가
FROM DB명.테이블명;
DISTINCT를 사용하면 중복을 제외한 데이터들을 조회할 수 있다.
5. WHERE
SELECT 상품번호
FROM DB명.PRODUCT
WHERE 판매국가 = '미국';
WHERE은 특정 테이블에서 원하는 컬럼값의 조건을 수행할 수 있다.
위와 같은 형식으로 작성하면 PRODUCT 테이블에서 판매국가가 미국인 나라의 상품번호를 빼오는 것이다.
6. IN
보통 WHERE과 같이 묶어서 사용하며, 원하는 컬럼을 여러개 뽑을 때 간결하게 표현할 수 있다.
7. BETWEEN
SELECT *
FROM DB명.테이블명
WHERE 컬럼 BETWEEN 시작점 AND 끝점;
BETWEEN은 특정 컬럼값의 구간을 설정해서 그 구간값만 출력한다.
대소관계를 나타낼 경우에는 부등호들을 사용해 표현한다.
8. IS NULL, NOT
SELECT 상품번호
FROM DB명.PRODUCT
WHERE 조건 IS NULL; 또는 IS NOT NULL;
IS NULL의 경우 결측치를 보여주며, NOT은 NULL을 제외한 부분에도 사용되며, 그에 반대되는 것을 의미한다.
9. COUNT
AS에서 사용했던 COUNT이며, 해당 컬럼의 갯수를 알 수 있다.
단, NULL이 존재하면 COUNT 하지 않는다.
10. LIKE '%TEXT%'
위처럼 %의 위치에 따라 찾고자 하는 글자가 어느 부분에 위치해야하는지가 다르다.
11. GROUP BY
다음 상황과 같이 집계함수 (COUNT, SUM, AVG 등) 와 리스트 (문자컬럼) 를 함께 작성하려면,
리스트 부분을 GROUP BY 로 묶어야만 에러없이 정상적으로 출력 가능하다.
12. CASE WHEN
IF 조건문과 같은 역할을 한다.
위의 구문은 합계만을 바로 나타내는 구문이고, 아래의 구문은 합계에 포함된 값들을 확인할 수 있는 구문이다.
그리고 좀 더 응용해서 위의 값에 대한 비율을 구해보면,
COUNT를 사용해서 다음 결과값을 얻을 수 있다.
13. JOIN
JOIN의 경우에는 3가지가 있는데 이해를 돕기 위해 아래 사진을 참고해주자.
두개의 데이터가 있을 때, 1번 데이터와 2번 데이터를 병합하려고 사용하는 것이 JOIN 이다.
두 데이터의 공통점은 고객 ID의 X값이며, 이 고객 ID를 활용하는 컬럼들은 다르다.
LEFT JOIN 은 왼쪽에 있는 1번 데이터를 기준으로 합쳐지는데, 고객 ID의 X, Y값을 기준으로 하게된다.
RIGHT JOIN 은 오른쪽에 있는 2번 데이터를 기준으로 합쳐지는데, 고객 ID의 X, Z값을 기준으로 하게된다.
FULL JOIN 은 두 데이터 내용들을 모두 합치는 것을 말한다.
이 때, 두 데이터에서 가지고 있는 값들이 달라 없는 부분의 경우에는 NULL 로 표시한다.
MYSQL에서 사용하는 구문이고, FULL JOIN 의 경우에는 애초에 지원하지 않아서 다른 방법을 사용해야 한다고 한다.
SELECT * FROM orders A
LEFT JOIN customers B ON A.customernumber = B.customernumber
UNION
SELECT * FROM orders A
RIGHT JOIN customers B ON A.customernumber = B.customernumber;
이렇게 UNION을 사용해서 두 결과값을 합치는 방법을 사용해야한다.
14. 윈도우 함수
윈도우 함수에는 RANK, DENSE_RANK, ROW_NUMBER 등이 있는데 주로 이 3가지를 많이 사용한다.
SELECT
buyprice
, ROW_NUMBER() OVER(ORDER BY buyprice) ROWNUMBER
, RANK() OVER(ORDER BY buyprice) RNK
, DENSE_RANK() OVER(ORDER BY buyprice) DENSERANK
FROM products;
내가 사용했던 예시 구문이며, 결과값은 다음과 같이 나온다.
간단히 설명을 하자면, ROW_NUMBER 는 해당열의 인덱스처럼 순서를 가르킨다.
RANK 는 해당 컬럼의 순위를 나타낸다.
이 때, 동일한 숫자에 대해서는 같은 값을 가지며, 중복된 값을 가져서 비어진 한칸의 순위를 건너뛴다.
DENSE_RANK 역시 해당 컬럼의 순위를 나타내고 동일한 숫자에 대해서 같은 값을 가지는 것은 RANK 와 같지만,
중복된 값을 가져서 비어버린 한칸의 순위부터 다시 시작한다. 즉, 건너뛰지 않는다.
그리고 첫번째 사진처럼 다른 종류에 대한 부분은 세가지 모두 처음부터 시작한다.
15. PARTITON BY
윈도우 함수와 같이 사용하는 구문으로 결과 집합을 그룹으로 나누고, 각 그룹내에서 윈도우 함수가 동작하도록 도와준다.
이를 통해서 데이터를 부분적으로 분석하고 결과를 해석할 수 있다.
16. SubQuery
SQL에서 가장 중요한 부분이다.
서브 쿼리란 쿼리 안에 또 다른 쿼리를 사용하는 것으로, 갯수의 제한이 없다.
기본적인 틀은 이런식으로 사용할 수 있다.
오늘 이렇게 SQL 구문에 대해 기본적인 부분을 모두 다뤄봤다.
앞으로 이 구문들을 자주 사용하면서 금방 익힐 수 있도록 해야겠다!
'SQL' 카테고리의 다른 글
SQL 서브 쿼리 짚고가기! (1) | 2023.10.10 |
---|---|
[MYSQL] 평점으로 상품 분류하기 - 실전 예제 (1) | 2023.10.06 |
[MYSQL] DATEDIFF를 사용한 Churn Rate 구하기 (1) | 2023.10.06 |
[MYSQL] 테이블 생성부터 삭제까지 알아보자 (0) | 2023.10.05 |
[MYSQL] Error code : 1175 안전 업데이트 모드 해결하기 (0) | 2023.10.05 |