이번 블로그에는 튜터님께 배운 SQL 을 복습하고 실습하는 수업에 대한 정리를 하겠습니다.
데이터와 친해지는 SQL - 1회차
🔥 수업 목표
1. SQL 기본구조: SELECT, FROM + 중복값을 제거하는 DISTINCT 함수
2. SQL 조건문: WHERE, CASE WHEN
3. 조건문을 지원하는 연산자
4. SQL 결과값 정렬: ORDER BY
5. 실습 문제
6. DBeaver에 CSV 파일을 업로드
예제 샘플 데이터셋은 튜터님께서 제공해주셨습니다.
1. SQL 기본구조: SELECT, FROM
1) SELECT 문: 이를 사용하여 테이블의 값(=열, 컬럼, 필드라고도 불려요!)를 선택할 수 있습니다.
2) 아스테리크( * ) 기호를 사용하여 모든 컬럼값을 한번에 추출할 수 있어요.
3) FROM 절은 사용할 테이블의 이름을 명시합니다.
4) MySQL에서 구문 마지막은 세미콜론( ; ) 으로 끝내야 합니다. 이를 사용하면 다수의 SQL을 작성
할 때, 실행하고 싶은 SQL구문에 마우스 커서를 두고 ctrl+Enter 버튼을 누르면 해당 SQL만 실행
됩니다.
5) 중복 없이 컬럼을 조회하고 싶다면, ‘DISTINCT’ 구문을 활용합니다.
-- 모든 컬럼을 조회할 경우
SELECT *
FROM 테이블이름
;
-- 특정 컬럼을 조회할 경우
SELECT 컬럼이름, 컬럼이름
FROM 테이블이름
;
-- 특정 컬럼을 중복없이 조회할 경우
SELECT DISTINCT 컬럼이름
FROM 테이블이름
;
2. SQL 조건문: WHERE, CASE WHEN
1) WHERE 절은 원하는 특정 조건만을 필터링하는역활을 합니다,
-- WHERE 절을 이용, 특정 조건을 만족하는 데이터 가져오기
select *
from basic.theglory
where 성별 ='F'
;
2) CASE WHEN도 조건에 따라 다른 결과값을 부여하빈다. WHEN은 조건에 따라 더 추가 할 수 있어요. 조건식을 모두 만족하지 않을 경우, ELSE로 간주되게 됩니다.
SELECT CASE WHEN 조건식1 THEN 결과1
WHEN 조건식2 THEN 결과2
ELSE 결과3
END AS 새로운 컬럼이름
FROM 테이블명
;
[🔎TIP ]
CASE WHEN 절의 작동 순서 :
가장 상단에 위치하는 첫번째 조건( CASE WHEN )을 우선으로 하여 참과 거짓을 구분하고,
그 다음 WHEN 절을 수행하고, 마지막으로 ELSE 절을 수행합니다.
3. 조건문을 지원하는 연산자
WHERE, CASE WHEN 조건문은 다양한 연산자를 지원합니다. 연산자들은 동시에 사용 가능합니다.
[ 연산의 우선순위 명시 ]
각 조건에 괄호()를 작성하여 우선적으로 연산하고,
해당 조건들을 모두 만족해야 하므로, 각 조건들은 AND 연산자로 연결해줘야 합니다.
SELECT *
FROM basic.theglory
WHERE 날짜 IS NOT NULL
AND (성별!='M')
AND 직업 IN('아나운서','승무원','화가')
AND (나이 BETWEEN 30 AND 40) -- 30 이상, 40 이하
4. 결과값 정렬: ORDER BY
ORDER BY 구문은 SQL 구문의 가장 마지막에 수행
ORDEY BY 구문은 필수는 아니며, 기본값은 ACS(오름차순)
오름차순은 ASC! 내림차순은 DESC!
ORDER BY 바로 뒤에 나오는 구문이 정렬 우선순위
# ORDER BY 다중조건
# 날짜를 내림차순으로 우선 정렬하고, 날짜가 같다면! 나이를 기준으로 오름차순 정렬
select 날짜, 이름, 성별, 나이, 직업
from basic.theglory
order by 1 desc, 4 ASC;
5. 실습 문제
문제1
date 컬럼이 2023-01-01 보다 큰 날짜의 game_account_id, game_actor_id, serverno를 추출해주세요.
select game_account_id, game_actor_id, serverno
from basic.users
where `date` >= '2023-01-01';
[🔎TIP ]
``은 예약어로 사용하지 않고 `컬럼명 또는 테이블명`으로 사용하겠다는 표시입니다. ( '따옴표'와 다름니다'' )
문제2
조건1) level 컬럼이 10 초과이고
조건2) serverno컬럼이 1이 아니며
조건3) 아이템이름컬럼이 레벨업 패키지 또는 시즌패스이고
조건4) 아이템 획득경로가 상점에서 구매한 경우의
date, ip_addr, exp, zone_id 를 추출하고 결과값을 date 기준 내림차순으로 정렬하여 추출해주세요.
select `date`, ip_addr, exp, zone_id
from basic.users
where (level > 10)
and (serverno != 1) # serverno is not 1 ⇒ 불가 / serverno not in (1) ⇒ 가능
and (etc_str2 = ('레벨업 패키지' or '시즌패스'))
and (etc_str1 = '상점에서 구매')
order by `date` desc;
문제3
case when 구문을 사용하여 레벨구간을 아래와 같이 구분해주시고, 컬럼이름을 ‘levelgroup’ 으로 설정해주세요. game_actor_id, level, levelgroup, date컬럼을 추출해주시고, date 를 기준으로 내림차순 정렬해주세요. 결과값은 아래와 같아야 합니다. (전체결과 중 일부)
- 레벨구간
- 1~10Lv 이하
- 11~20Lv 이하
- 21~30Lv 이하
- 31~40Lv 이하
- 41~50Lv 이하
- 51~60Lv 이하
- 61~70Lv 이하
- 71~80Lv 이하
- 81~90Lv 이하
- 91~100Lv
select game_actor_id, level,
CASE WHEN level between 1 and 10 then '1~10Lv'
WHEN level between 11 and 20 then '11~20Lv'
WHEN level between 21 and 30 then '21~30Lv'
WHEN level between 31 and 40 then '31~40Lv'
WHEN level between 41 and 50 then '41~50Lv'
WHEN level between 51 and 60 then '51~60Lv'
WHEN level between 61 and 70 then '61~70Lv'
WHEN level between 71 and 80 then '71~80Lv'
WHEN level between 81 and 90 then '81~90Lv'
WHEN level between 91 and 100 then '91~100Lv'
end levelgroup, date
from basic.users
order by `date` desc;
CASE WHEN 절의 작동 순서를 생각해야합니다.
가장 상단에 위치하는 첫번째 조건( CASE WHEN )을 우선으로 하여 참과 거짓을 구분하고,
그 다음 WHEN 절을 수행하고, 마지막으로 ELSE 절을 수행하기 때문에 between구문을 쓰지 않아도 됩니다.
# 튜터님 정답쿼리 1
select `date`, game_actor_id, level,
case when level <=10 then '1~10Lv 이하'
when level <=20 then '11~20Lv 이하'
when level <=30 then '21~30Lv 이하'
when level <=40 then '31~40Lv 이하'
when level <=50 then '41~50Lv 이하'
when level <=60 then '51~60Lv 이하'
when level <=70 then '61~70Lv 이하'
when level <=80 then '71~80Lv 이하'
when level <=90 then '81~90Lv 이하'
else '91~100Lv' end as levelgroup
from basic.users
order by `date` desc
;
# 튜터님 정답쿼리 2
select `date`, game_actor_id, level,
case when level>=1 and level <=10 then '1~10Lv 이하'
when level>=11 and level <=20 then '11~20Lv 이하'
when level>=21 and level <=30 then '21~30Lv 이하'
when level>=31 and level <=40 then '31~40Lv 이하'
when level>=41 and level <=50 then '41~50Lv 이하'
when level>=51 and level <=60 then '51~60Lv 이하'
when level>=61 and level <=70 then '61~70Lv 이하'
when level>=71 and level <=80 then '71~80Lv 이하'
when level>=81 and level <=90 then '81~90Lv 이하'
else '91~100Lv' end as levelgroup
from basic.users
order by `date` desc
;
문제4
date 컬럼을 yyyy-mm 형식의 월 형태로 바꾸고, 컬럼이름을 m 으로 지정해주세요.
game_account_id, game_actor_id 를 추출하되, 월을 기준으로 오름차순, 월이 같을 경우 game_actor_id 를 내림차순으로 정렬해주세요. 결과값은 아래와 같아야 합니다. (전체결과 중 일부)
select date_format(date(`date`),'%Y-%m') m,game_account_id, game_actor_id
from basic.users
order by m, game_actor_id desc;
# 튜터님 정답쿼리
select distinct substr(`date`,1,7)as m, game_account_id, game_actor_id
from basic.users
order by substr(`date`,1,7) asc, game_actor_id desc
# select문에서 substr(`date`,1,7) 또는 date_format(`date`, '%Y-%m')
# substr 몇 번째부터 몇 번째까지만 조회
# MySQL에서는 첫번쨰 자리가 0이 아닌 1임
# select문에서 distinct 필수 아님, 단지 꼼꼼하게 퀴리를 짜기 위함
[🔎TIP ]
MySQL에서는 첫번쨰 자리가 0이 아닌 1입니다.
6. DBeaver에 CSV 파일을 업로드
basic 이라는 데이터베이스를 만들고, 데이터 가져오기를 통해 CSV 파일을 업로드합니다.
한글컬럼 깨짐 방지를 위해, euc-kr 로 인코딩 설정을 변경해주세요.
SQL 편집기를 새로 만들어주세요.
SQL 을 처음부터 보고싶으시다면 여기를 클릭📣
Python을 처음부터 보고싶으시다면 여기를 클릭📣
좋은 하루 되세요~🌃
'SQL' 카테고리의 다른 글
[TIL] SQL복습&심화_21일차(UNION,JOIN,SUB QUERY) (0) | 2024.04.26 |
---|---|
[TIL] SQL복습&심화_20일차(집계함수,GROUP BY, HAVING,SUB QUERY) (0) | 2024.04.24 |
[TIL] SQL_10일차(Window Function,Rank,Sum, date type) (0) | 2024.04.05 |
[TIL] SQL_9일차(null,coalesce,Pivot view) (0) | 2024.04.04 |
[TIL] SQL_8일차(JOIN,LEFT JOIN,INNER JOIN) (0) | 2024.04.03 |