.

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기

4주차 - 수강일자 211003

 

With

subquery 를 각각 써주는 게 아니라 table로 명명시켜서 쿼리문 작성 편의 및 가시성을 높인다.

 

구조 예시

( subquery )를 하나의 column처럼 사용

with table1 as ( subquery ) t1,
       table2 as ( subquery ) t2
select * from table

주의 점🔥

( subquery ) 마다 약어를 다 지정해줘야 한다.

 

적용 예시 - 4주 차 1번째 기록에 있는 예시

 

* 적용 전

select * from ( subquery ) s1
inner join ( subquery ) s2
on s1.column = s2.column

* 적용 후

with table1 as ( subquery ) s1,
	table2 as ( subquery ) s2
select * from s1
inner join s2
on s1.column = s2.column

서브 쿼리가 많아지고 복잡해질수록 with 구문을 쓰는 것이 훨씬 가독성이 좋아진다.

 

Substringindex

특정 기준으로 문자를 잘라서 원하는 부분만 출력하기

- python의 split과 동일

- SQL은 python과 달리 0,1,2,3으로 세는 게 아니라 1,2,3,4로 센다. 다만 -1이 마지막을 뜻하는 것은 동일하다.

 

구조 예시

SUBSTRING_INDEX( 자를 칼럼명, '기준 문자', 자른 후 출력할 위치)

 

적용 예시

email 칼럼에 들어있는 spartacodingclub@naver.com와 같은 이메일들을 @단위로 쪼개서 naver.com 만 보고 싶을 때

 

방법 1

SUBSTRING_INDEX(email, '@', 2) 

해석 : email을 @을 기준으로 잘라서 2번째에 있는 걸 출력해라

출력 값 : naver.com

 

방법 2

SUBSTRING_INDEX(email, '@', -1)

해석 : email을 @을 기준으로 잘라서 끝에 있는 걸 출력해라

출력 값 : naver.com

 

Substring

문자열을 특정 시점부터 특정 지점까지만 출력해라

 

구조 예시

SUBSTRING( 자를 칼럼명, 시점 위치 숫자로, 마지막 위치 숫자로)

 

적용 예시

created_at 칼럼에 들어있는 2020-07-07 15:00:22와 같은 일자-시간에서 날짜만 보고 싶을 때

 

SUBSTRING(created_at,1,10)

해석 : created_at에서 1번째 인 '2'부터 10번째에 위치한 '7'까지 출력해라

출력 값 : 2020-07-07

 

CASE

특정 조건에 따라 데이터를 구분할 때

- python의 if문과 비슷하다고 보면 편하다.

 

구조 예시 - case를 두 가지로 나눌 때

select column1, column2,
	case when column3 > ( 값 ) then '출력문구'
    	else '출력문구2' end
from table

 

구조 예시 - case를 세 가지 이상으로 나눌 때

select column1, column2,
	case when column3 > ( 값 ) then '출력문구'
    	when column3 > ( 값2 ) then '출력문구2'
    	else '출력문구3' end
from table

 

구조 예시 - 깔끔하게 정리할 때 / 실제 사용할 때

select column1, column2,
	(case when column3 > ( 값 ) then '출력문구'
    		when column3 > ( 값2 ) then '출력문구2'
    		else '출력문구3' end) as Partition
from table

case 구문을 하나로 () 묶어주고 as로 alias 별칭을 만들어준다.

 

주의 점🔥

조건을 걸 때마다 when을 써준다. when 절이 끝난다고 해서 콤마를 붙이거나 하지 않는다. (파이썬과 다름)


강의 기록

 

4주차 강의 기록 (1) - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 서브쿼리 select, where, from, subquery, 구

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 4주차 - 수강일자 211003 Subquery "쿼리안의 쿼리" 쿼리 여러 개가 포함관계로 구성되어 있다고 보면 편하다. subquery는 select, from, where 모두에 들어갈 수.

slowslow.tistory.com

 

3주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - union all, left join, inner join, 쿼리 실행 순

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 3주차 - 수강일자 211002 join 두가지 테이블의 key 칼럼을 기준으로 테이블을 연결해서 하나의 테이블로 표기하는 것 - 두 테이블을 실제로 합치는 게

slowslow.tistory.com

 

2주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 묶기 그루핑하기 group by, 정렬하기 order

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 2주차 - 수강일자 210921 통계 최대 max () 최소 min () 평균 avg () 갯수세기 count () 묶기 기준 만들기 칼럼(필드) 내 항목으로 그루핑하기 group by 칼럼명 gr.

slowslow.tistory.com

 

1주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 기본 문법, where, 같다 다르다, 중복 데

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 1주차 - 수강일자 210920 기본 쿼리문 : 데이터베이스에 명령을 내리는것 CRUD 네가지 메인 액션이있지만 DB관련 직종이 아닌이상 R(read)만 제대로 하면

slowslow.tistory.com

 

.

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기

4주차 - 수강일자 211003

 

Subquery

"쿼리안의 쿼리" 쿼리 여러 개가 포함관계로 구성되어 있다고 보면 편하다.

subquery는 select, from, where 모두에 들어갈 수 있다.

 

 

Select subquery

구조 예시

( subquery )를 하나의 column 처럼 사용

select column1, column2, ( subquery ) 
from table

주의 점🔥

( subquery ) 내의 where 절을 통해서 바깥 query와 ( subquery ) 간의 연결지점을 꼭 명시해야 한다.

스파르타 코딩클럽 select subquery 문 예시 요약

 

From subquery

구조 예시

( subquery )를 하나의 table처럼 사용

select * from table t1
inner join ( subquery ) s1
on t1.column = s1.column
select * from ( subquery ) s1
inner join ( subquery ) s2
on s1.column = s2.column

주의 점🔥

( subquery ) 사용할 때마다, table 약어를 지정해줘야 한다!

스파르타 코딩클럽 from subquery 문 예시 요약

Where subquery

구조 예시

where 칼럼명 in (subquery)

select * from table
where column in ( subquery )

주의 점🔥

( subquery )의 select 된 column과, 바깥 query의 column명을 동일하게 잡아줘야 연결이 된다.

스파르타 코딩클럽 where subquery 문 예시 요약

 

 

강의 기록

 

3주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - union all, left join, inner join, 쿼리 실행 순

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 3주차 - 수강일자 211002 join 두가지 테이블의 key 칼럼을 기준으로 테이블을 연결해서 하나의 테이블로 표기하는 것 - 두 테이블을 실제로 합치는 게

slowslow.tistory.com

 

2주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 묶기 그루핑하기 group by, 정렬하기 order

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 2주차 - 수강일자 210921 통계 최대 max () 최소 min () 평균 avg () 갯수세기 count () 묶기 기준 만들기 칼럼(필드) 내 항목으로 그루핑하기 group by 칼럼명 gr.

slowslow.tistory.com

 

1주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - 기본 문법, where, 같다 다르다, 중복 데

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 1주차 - 수강일자 210920 기본 쿼리문 : 데이터베이스에 명령을 내리는것 CRUD 네가지 메인 액션이있지만 DB관련 직종이 아닌이상 R(read)만 제대로 하면

slowslow.tistory.com

 

.

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기

3주차 - 수강일자 211002

 

join

두가지 테이블의 key 칼럼을 기준으로 테이블을 연결해서 하나의 테이블로 표기하는 것

- 두 테이블을 실제로 합치는 게 아니라 그렇게 showing 하는 방식

- 중등수학의 '교집합' 개념과 연관

- SQL의 join 개념은 엑셀에 vlookup과 유사

- 대표적으로 많이 사용하는 방식은 left join, inner join 두 가지

 

left join

select * from A a

left join B b on a.coulmn = b.coulmn

: A에 B를 column을 기준으로 left join 한다.

 

- left join은 A에 맞는 B만 가져오기 때문에 B에 null 값이 나올 수 있다.

- 순서가 정해져 있기 때문에 "~에 ~를 붙인다"라는 구문의 순서에 주의해야 한다.

 

inner join

select * from A a

inner join B b on a.coulmn = b.coulmn

: A에 B를 column을 기준으로 inner join 한다.

 

- inner join은 A, B의 교집합만 가져오기 때문에 null 값이 나타나지 않는다.

- 순서가 정해져 있지 않기 때문에 "~에 ~를 붙인다"라는 구문의 순서와 무관하다.

 

SQL 쿼리의 실행 순서

from → join → select

- from 데이터를 가져오고, join 데이터를 연결하고, select 연결된 데이터를 출력한다.

 

from → join → where → group by → select

- from 데이터를 가져오고, join 데이터를 연결하고, where 데이터를 필터링하고, group by 특정 column을 기준으로 그루핑 하고, select 연결된 데이터를 출력한다.

 

left join으로 null 값이 생겼을 때

where coulmn is NULL

where coulmn is not NULL

위 두 가지 방법으로 NULL을 선택하거나, 필터링할 수 있다.

 

NULL과 전체를 세는 방법

count는 NULL을 세지 않는다. 즉, 값이 있는 열만 센다.

따라서, NULL값이 들어가 있는 column을 기준으로 세게 되면 not NULL 인 raw의 개수만 센다.

 

전체를 세는 방법 : 모든 행에 NULL값이 없는 column을 따로 세준다.

ex. count(key column) : key column은 null 값이 없으므로 key column을 세주면 전체 행을 세준 것과 같은 결과를 낳는다.

 

union

두 가지 데이터를 key column을 기준으로 연결하는 게 아니라, 병렬적으로 나열해 이어진 것처럼 표기하는 것

- 작성방법

	(
	data 1...
	)
union all
	(
	data 2...
	)

- 주의할 점

union을 사용하면 order by 가 적용되지 않는다. 이는 subquery를 통해 대체할 수 있다.

 


강의 기록

 

2주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 2주차 - 수강일자 210921 통계 최대 max () 최소 min () 평균 avg () 갯수세기 count () 묶기 기준 만들기 칼럼(필드) 내 항목으로 그루핑하기 group by 칼럼명 gr.

slowslow.tistory.com

 

1주차 강의 기록 - [스파르타코딩클럽] 엑셀보다 쉬운 SQL

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 1주차 - 수강일자 210920 기본 쿼리문 : 데이터베이스에 명령을 내리는것 CRUD 네가지 메인 액션이있지만 DB관련 직종이 아닌이상 R(read)만 제대로 하면

slowslow.tistory.com

 

.

파이썬 혼자놀기 패키지 (무료 강의)

3일 차 - 수강 일자 210930

 

from wordcloud import WordCloud

text = ''
with open("kakaotalk.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        text += line

wc = WordCloud(font_path='/System/Library/Fonts/AppleSDGothicNeo.ttc', background_color="white", width=600, height=400)
wc.generate(text)
wc.to_file("result.png")

 

코드 설명

from wordcloud import WordCloud

워드클라우드 라이브러리를 사용한다.

 

text = ''
with open("kakaotalk.txt", "r", encoding="utf-8") as f:

    lines = f.readlines()
    for line in lines:
    text += line

text를 공란으로 만들어주고, kakaotalk.txt라는 파일을 오픈한다. (txt파일이라면 어떤 파일도 무방하다. 카카오톡 톡 내보내기를 통해 사용하는 것을 강의에서 권하고 있으나, 그럴 경우 csv파일로 export되어 적용이 안된다.)

kakaotalk.txt파일의 모든 줄들을 읽어서 한줄한줄을 text에 채워준다.

 

wc = WordCloud(font_path='/System/Library/Fonts/AppleSDGothicNeo.ttc', background_color="white", width=600, height=400)
wc.generate(text)
wc.to_file("result.png")

text에 워드클라우드 함수를 적용한다.

폰트를 설정하고, 백그라운드 컬러와 가로 세로 크기를 결정한다.

저장할 파일 명을 결정한다. result.png

 

🔥 이때 폰트 경로 설정이 중요하다.

아래의 코드를 통해 폰트들의 링크를 가져올 수 있다. 왜인지 모르게 ttf type의 폰트는 적용이 안돼서, ttc파일을 적용시켰다.

 

폰트 경로 가져오기

import matplotlib.font_manager as fm

for font in fm.fontManager.ttflist:
    if 'Gothic' in font.name:
        print(font.name, font.fname)

폰트 경로 출력 결과

Apple SD Gothic Neo /System/Library/Fonts/AppleSDGothicNeo.ttc
Hiragino Maru Gothic Pro /System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc
Noto Sans Gothic /System/Library/Fonts/Supplemental/NotoSansGothic-Regular.ttf
AppleGothic /System/Library/Fonts/Supplemental/AppleGothic.ttf

위의 링크에서 /로 시작하는 폰트 링크를 복사해 위의 내용을 font_path에 넣으면 된다.

 

if, 혹시 폰트 경로만 출력하고싶다면 아래의 코드를 입력하면 된다.

import matplotlib.font_manager as fm

for font in fm.fontManager.ttflist:
    if 'Gothic' in font.name:
        print(font.fname)

 

출력 결과

.

결과를 보면 무의미한 내용이 엄청 많이 들어있다. ㅋㅋㅋ, hk 이런내용들이다.

여기서 무의미한 데이터들을 필터링해주는 데이터클리닝 과정을 진행한다.

 

데이터 클리닝

text = ''
with open("kakaotalk.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]: 
        if '] [' in line: 
        text += line.split('] ')[2].replace('ㅋ','').replace('ㅜ','').replace('이모티콘\n','').replace('삭제된 메시지입니다','')

for line in lines[5:]:

5번째 줄부터 출력 (초반에 불필요한 메시지들 제외)

 

if '] [' in line:

사람들이 말한 경우만 포함하기 = 시스템 명령어 제거하기

파일 구조에 시스템 명령어들은 ] [를 포함하고 있지 않고, 사람이 말한 경우 "[말한사람이름] [시간] 말한 내용 "이렇게 돼서 위의 트릭으로 사람이 말한 경우만 포함 할 수 있다.

 

line.split('] ')[2]

파일 구조가 "ex. [정훈hk] [오후 5:10] 왜 우울한지 고르시오"이런식으로 생겨서 '] '를 기준으로 짜르면 text부분이 2순서에 위치함. 일종의 트릭

 

.replace('ㅋ','').replace('ㅜ','').replace('이모티콘\n','').replace('삭제된 메시지입니','')

위와 같은 이유와 목적으로 여러가지 무의미한 내용들을 삭제한다.

 

 

다시 워드클라우드

이렇게 클리닝된 내용을 기반으로 워드클라우드를 다시 해보자

from wordcloud import WordCloud

text = ''
with open("kakaotalk.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
        text += line.split('] ')[2].replace('ㅋ','').replace('ㅜ','').replace('이모티콘\n','').replace('삭제된 메시지입니다','').replace('저두','').replace('저도','').replace('근데','').replace('나','').replace('아','')

wc = WordCloud(font_path='/System/Library/Fonts/AppleSDGothicNeo.ttc', background_color="white", width=600, height=400)
wc.generate(text)
wc.to_file("result4.png")

 

출력 결과

.

전보다는 훨씬 유의미한 내용들만 남은것을 볼 수 있다.

 

원하는 모양으로 워드클라우드

원하는 형태의 이미지를 import 해서 워드클라우드를 만들자

from wordcloud import WordCloud
from PIL import Image
import numpy as np

text = ''
with open("kakaotalk.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines[5:]:
        if '] [' in line:
        text += line.split('] ')[2].replace('ㅋ','').replace('ㅜ','').replace('이모티콘\n','').replace('삭제된 메시지입니','').replace('저두','').replace('저도','').replace('근데','').replace('나','').replace('아','')

mask = np.array(Image.open('cloud.png'))
wc = WordCloud(font_path='/System/Library/Fonts/AppleSDGothicNeo.ttc', background_color="white", mask=mask)
wc.generate(text)
wc.to_file("result_masked.png")

 

적용시킨 이미지 (cloud.png)

.

 

출력 결과

.

wordcloud 함수는 이미지상의 '검은색영역'에 워드클라우드를 만드는 것을 볼 수 있다.

 

다른 이미지

다른 이미지 출처 

 

위처럼 형태가 다른 이미지를 넣어서 적용할 경우

.

역시 검정 영역에 채워지는 결과를 볼 수 있다.

검정과 흰색의 대비가 애매한 이미지를 사용하면 위의 사각형과 동일한 결과를 낸다.

 

.


 

강의 회고록으로 이어집니다. 👇

(회고록 링크 추가예정)


스파르타 코딩클럽 5만 원 할인 쿠폰 링크 💵

아래 링크를 통해 가입하시면, 즉시 5만원 할인 쿠폰이 발급됩니다!

 

스파르타코딩클럽

왕초보 8주 완성! 웹/앱/게임 빠르게 배우고 내것을 만드세요!

spartacodingclub.kr

 

+ Recent posts