좋았을것들

나는 이번 3월 SQLD시험을 신청했다가 환불했다.

충분히 공부를 못해서 환불한 것도 맞지만, 예상과 다른 부분이 있어서 굳이 SQLD 자격증을 따지 않아도 되겠다는 생각을 했다.

오히려 이 내용을 신청 전에 알았다면 신청하지 않았을 텐데라는 생각으로, SQLD 자격증을 준비하고자 하는 모든 사람들을 위해 글을 쓴다.

 

응시료(비용)와 환불 💸

- 응시료 :  5만 원

- 신청 후 5일 이내 환불 : 전액 환불 (5만 원)

- 신청 후 5일 이후 환불 : 50% 환불 (2.5만 원)

 

DBMS종류

MS SQL, ORACLE 언어로 되어있음

SQL은 MS SQL, ORACLE, MYSQL 등 다양한 DBMS로 구성되어있고, SQLD 시험은 MS SQL과 ORACLE이 혼재되어 출제됨.

즉, 다른 DBMS를 써봤거나, 다른 DBMS만 쓰는 환경이라면 SQLD 자격 보유 여부는 실질적인 메리트가 적다.

 

인프런 등 국내 SQL강의에서 가장 많이 사용하는 DBMS는 MySQL로 위의 두 가지와 다르기 때문에 실질적으로 MySQL을 다뤄본 사람이 시험 준비를 한다고 해도 이점은 적으며, 오히려 기존에 사용하던 문법과 다르기 때문에 헷갈릴 수도 있다.

 

현업자에게 필요한가?

"자격요건이 없는" 대부분의 자격증이 그렇듯 SQL을 통한 프로젝트 경험이 있어 포트폴리오나 이력사항으로 증명 가능한 경우 본 자격증은 크게 의미가 없다고 볼 수 있다. 즉 현직자에게는 큰 의미가 없다. 

 

데이터 분석가를 제외하면 SQL 사용에 대해서 가장 많이 어필되는 직군은 마케팅, 기획자인듯하다. 실제로 주변의 마케터와 기획자분들을 보면 SQL을 사용하지 못하는 분은 드물다. 운영(사업개발) 직군 분들도 사용하시는 경우가 있을 정도로 대중적인 스킬.

 

하지만 반대로 그분들 중에서 SQLD를 보유한 분 역시 보지 못했다.

물론, 이 부분은 SQLD자격증이 생긴 지 얼마 안 되어서이기도 할 것이지만, 실질적인 매력도와 필요성이 낮은 자격증임을 의미한다.

 

데이터 분석가나 개발자가 아닌 이상, 현업에서는 데이터 구조가 어떻게 생기고 어떤 DMBS가 특성을 가지는지 알 필요가 없다. 그저 유의미한 데이터를, 정확하게 뽑고 잘 활용하는지가 중요하다.

 

정리하자면

즉, MySQL로 SQL을 사용하시는 저와 같은 현직자 분들께는 추천드리지 않습니다.

아직 사용하는 언어가 없는 취업준비생 분들께는 대체 가능한 자격증도 없고, 프로젝트도 어렵기때문에 추천드립니다.

차라리, Coursera와 같은 교육 프로그램을 통해서 SQL certificated를 받는 것을 추천드립니다.

_

스파르타 코딩클럽의 SQL 강의 수강 후, 조금 더 연습이 필요하다고 생각해 프로그래머스 SQL 고득점 kit를 풀어보게 됐다.

아래의 모든 답은 직접 풀어본 후 적은 답입니다. SQL 특성상 query가 다르더라도 같은 결과에 도출됐다면 모든 query는 정답이 될 수 있습니다.


문제 링크 👇

 

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

프로그래머스 문제 키트 👇

6개의 세트


SELECT

  • 모든 레코드 조회하기

동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

SELECT * 
from animal_ins
order by animal_id

 

  • 역순 정렬하기

동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. 

SELECT name, datetime
from animal_ins
order by animal_id desc

 

  • 아픈 동물 찾기

동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

select animal_id, name
from animal_ins
where intake_condition = 'sick'
order by animal_id
  • 어린 동물 찾기

동물 보호소에 들어온 동물 중 젊은 동물 1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

* INTAKE_CONDITION이 Sick 인 경우를 뜻함

select animal_id, name
from animal_ins
where intake_condition = 'sick'
order by animal_id

 

  • 동물의 아이디와 이름

동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.

select animal_id, name
from animal_ins

 

  • 여러 기준으로 정렬하기

동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

select animal_id, name, datetime
from animal_ins
order by name,datetime desc

 

  • 상위 n개 레코드

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

select name
from animal_ins
order by datetime
limit 1

SUM, MAX, MIN

  • 최댓값 구하기

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

select datetime
from animal_ins
order by datetime desc
limit 1

 

  • 최솟값 구하기

동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

select datetime
from animal_ins
order by datetime
limit 1

 

  • 동물 수 구하기

동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

select count(*)
from animal_ins

 

  • 중복 제거하기

동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

select count(distinct(name))
from animal_ins
where name is not null

 

  • 고양이와 개는 몇 마리 있을까

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

select animal_type, count(*)
from animal_ins
group by animal_type
order by animal_type

"고양이를 개보다 먼저 조회해주세요"때문에 order by 조건이 있어야만 정답으로 처리된다.

아래처럼 order by 조건이 없어도 결과상의 차이는 없다.

select animal_type, count(*)
from animal_ins
group by animal_type

 


 

4주차 강의 기록 (2) - [스파르타코딩클럽] 엑셀보다 쉬운 SQL - subquery, with, substring_index, substring, 문

스파르타코딩클럽 엑셀보다쉬운 SQL (4주) 33기 4주차 - 수강일자 211003 With subquery 를 각각 써주는 게 아니라 table로 명명시켜서 쿼리문 작성 편의 및 가시성을 높인다. 구조 예시 ( subquery )를 하나의

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

 

.

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

1일 차 - 수강 일자 210925

 

스파르타 코딩 클럽에서 단기적으로 진행중인 [힙한 취미 코딩 이벤트]의 무료강의중 하나인 파이썬 웹크롤링 강의를 수강중이다. 일전에 유투브를 통해서 셀레니움, 뷰티풀숩 등으로 크롤링을 시도했지만 파이썬 기본문법에 대한 기본적인 이해가 부족해 매번 실패했다. 그래서 이번 기회에 제대로 배우고자 크롤링 강의를 무료로 수강하게 됐다.

 

대학교에서 business programming 과목을 통해 python 기본 문법을 배웠지만, 충분한 이해를 하지 못해 이번 기회를 통해 python에 대한 복습을 하고자 했다.

 

 

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

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

 

스파르타코딩클럽

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

spartacodingclub.kr

 

* 아래의 모든 코드는 m1 맥북을 기준으로 합니다.

 

python 기본 문법

 

## 1-2 파이썬 시작하기

print ('hello sparta')

 

기본 연산

## 1-3강 파이썬 기초 공부
a = 2 # 프로그래밍에서 a = 3 의 의미는 a에 3을 넣어라
b = 3
a+b # 숫자 연산시키면 값이 연산된다.

 

문자와 숫자

first_name = 'kimkim' # 문자열은 '' 따옴표를 써줘야 한다. 숫자 / 변수는 그냥 써주면 된다.
last_name = 'hoho'

print(first_name + last_name) # 문자열 더하기 문자열은 단순히 붙어서(연결돼서) 나온다

print(str(3)+'kikkik') # 문자열과 숫자열은 더할 수 없다. 문자와 숫자를 더하려면 숫자를 문자로 바꿔줘야 함

변수명 지정 스타일 (코드 컨벤션)

# 회사마다 변수명 쓰는 방법 (코드 컨벤션)이 있다.
# lastName : 카멜
# last_name : 스네이크

 

리스트

# 파이썬에서 숫자는 0,1,2,3 순서로 센다
a_list = ['사과', '감', '배'] # 여기서 사과, 감, 배는 각각 0,1,2번째 위치이다.
print(a_list [1]) #리스트 내의 1번 위치인 감을 출력한다.

b_list = ['영희', '철수', ['사과', '감']]
print(b_list [0]) # 리스트 내의 0번째인 영희를 출력한다.
print(b_list [2][0]) # 리스트 내의 리스트의 위치는 [][]를 연결해서 작성해서 표기한다. 사과가 출력된다.

a_list.append('김치') # list에 요소를 추가하고 싶을 때 append 함수를 연결해서 써주면 된다.
print(a_list)

 

딕셔너리

# dictionary 형태 - 구조 {키 : 벨류, 키 : 벨류,... }
a_dict = {'name' : 'bob', 'age':24}
print(a_dict ['name']) # dictionary 형에서는, key값을 입력하면 value를 출력한다.

a_dict['height']=189 #dictionary에 값 추가하기 - 구조 : [key값] = value 값
print(a_dict)

a_dict = {'name':'bob','age':24}
a_list = ['수박','참외', '배']

a_dict['fruits'] = a_list #dictionary에 리스트 추가하기 - key값은 fruits, value값은 list
print(a_dict) # dictionary value 값에는 리스트를 넣을 수 있다. key값에는 못넣는다.

a_dict['fruits'] # 딕셔너리 내에 리스트를 출력하기 = 딕셔너리 내에 리스트를 벨류값으로 갖고있는 키값을 출력요청
a_dict['fruits'][0] # 딕셔너리 내에 리스트내에 수박을 출력하기

 

조건문 if

age = 24

if age > 20:
     print('성인입니다')
else:
     print('청소년입니다')

반복문 (for 문)

# 반복문 : 리스트에서 하나씩 빼서 쓰는것이다.
fruits = ['사과','배','배','감','수박','귤','딸기','사과','배','수박']
for fruit in fruits: # fruits 안에있는 요소들을 fruit라고 할거야. 그리고 요소들을 순서대로(0,1,2,3...) 꺼낼거야
print(fruit) # 꺼낸 요소 fruit 을 출력해

 

# 리스트를 쭉돌리는데, 내부변수가 '사과'와 같을때 그 변수를 출력해라
for fff in fruits: # 이번엔 fruits리스트 안의 요소를 fruit 라고하지않고 fff라고 할거야, 변수명은 정하기 나름이다
     if fff == '사과' :
print(fff)

# count 가 0으로 시작하는데, 리스트내의 변수가 '사과'와 동일할때마다 count를 1씩올려줘. 그리고 그 count를 출력해줘
count = 0
for fruit in fruits :
if fruit == '사과' :
count += 1
print(count)

# dictionary 를 포함한 리스트 형태에서 for문 돌리기
people = [{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27}]

for x in people: # 모든 사람의 이름과 나이를 출력해봅시다.
print(x['name'],x['age']) # people이라는 리스트 속의 요소를 x라고 했는데, 그 요소의 key 값이 name 일때와 age일때의 vlaue값을 순서대로 출력해라


# dictionary 를 포함한 리스트형태에서 for문과 if문 돌리기

people = [{'name''bob', 'age'20},
{'name''carry', 'age'38},
{'name''john', 'age'7},
{'name''smith', 'age'17},
{'name''ben', 'age'27}]

 

for x in people: # 20세 보다 많은 사람만 출력하기
if x['age'] > 20:
print(x['name'],x['age'])

 

파이썬 내장함수

# split : 쪼개기

# 이메일주소에서 domain만 남기기
myemail = 'sparta@naver.com'
result = myemail.split('@') # @를 기준으로 쪼개라
print(result) # 쪼갠걸 출력해라, 리스트로 나옴
print(result[1]) # 쪼갠 결과값에서 두번째에 해당하는 애만 출력해라

# 이메일남긴거에서 naver만 남기기
print(result[1].split('.')[0]) # 쪼갠 결과값에서 두번째에 해당하는 애(naver.com)만 출력한다음에 걔를 다시 .을 기준으로 쪼개고 앞에있는 naver만 출력해라

# replace : 대체하기, 바꾸기

# 네이버를 gmail로 바꾸기
result = myemail.replace('naver','gmail')
result

 

이미지 다운로드 (단일) dload

# dload : 이미지 주소를 입력하면 자동으로 다운로드 해주는 library

 

import dload # dload 패키지를 import시키고
dload.save("이미지주소url""저장시킬 이미지 파일명")

# 이미지 주소 예시 : https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Jeju_Island.jpg/1200px-Jeju_Island.jpg

# 이미지 파일명 예시 img.jpg 

 

이미지 다운로드/크롤링 (복수) 

import dload
from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('./chromedriver')
driver.get("이미지 검색 url")
time.sleep(5)

req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')


thumbnails = soup.select("#imgList > div > a > img")
i=1
for thumbnail in thumbnails:
    src = thumbnail["src"]
    dload.save(src, f'#폴더명/{i}.jpg')
    i+=1

driver.quit()


# 이미지 검색 url 예시 : https://search.daum.net/search?w=img&nil_search=btn&DA=NTB&enc=utf8&q=%EC%95%84%EC%9D%B4%EC%9C%A0

# 이미지 검색 url 적용 예시 

driver.get("http://search.daum.net/f.... ") <- url은 문자입력값이므로 ""가 필요함

 

# 폴더명 예시 : homework <- 코드 실행전에 미리 이미지를 저장시켜둘 폴더를 만들어야함

# 폴더명 적용 예시

dload.save(src, f'homework/{i}.jpg') <- 폴더명도 문자값이나 양쪽에 ''따옴표가 있기 때문에 적용가능


 

스파르타코딩클럽

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

spartacodingclub.kr

+ Recent posts