본문 바로가기
SQL

[TIL] SQL복습&심화_19일차(SELECT, FROM,DISTINCT,WHERE,CASE WHEN,연산자,ORDER BY)

by 공부하죠 2024. 4. 24.
반응형

이번 블로그에는 튜터님께 배운 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을 처음부터 보고싶으시다면 여기를 클릭📣

좋은 하루 되세요~🌃

반응형