인사말

안녕하세요!

오늘부터 본캠프가 시작되는 날입니다.

그래서 오늘 12시간 동안 새로운 팀원들과 함께 공부하였습니다.

12시간 중에서 6시간 정도 집중했어요!

오전에는 OT가 있었기에 점심 식사 시간과 저녁 식사 시간을 제외한 나머지 시간 동안은 열심히 집중했답니다 😋

개인 공부를 진행하며, 모르는 부분이 생기면 서로에게 물어보면서 배워나갔습니다.

제가 모르는 점을 바로 물어볼 수 있다는 점이 너무 좋았습니다🫶

상시 튜터 님들과 매니저 님이 곁에 계셔서 든든하네요 😜

 

아무튼! 오늘부터는 Python 공부 내용을 포스팅 할 겁니다

잘 부탁드립니다 🙏🏻


요약

  1. 변수란?
  2. 변수 선언이란?
  3. 변수 할당이란?
  4. 컬렉션 자료형(리스트, 튜플, 딕셔너리, 셋)
  5. 명시적 타입 전환(int, float, str, bool)
  6. 컬렉션 타입 변환(list, tuple, set)
  7. 암시적 타입 변환(숫자형 데이터간의 연산)
  8. 타입 변환시 주의할 점🚨

1. 변수란?

변수 : 컴퓨터 프로그램에서 데이터를 저장하기 위해 사용되는 "이름이 붙은 저장 공간"

즉, 어떤 값을 저장해두고 필요할 때 그 값을 꺼내 사용하는 역할

name = "배민경"
age = 25

여기서 name과 age가 "변수"에 해당됩니다!


2. 변수 선언이란?

변수 선언 : 원하는 변수를 불러오는 행위

name = "배민경"
age = 25
print(name)

print()가 결괏값을 돌출하는 함수이고, 괄호 안에 있는 "name"을 선언함으로써

결괏값 : 배민경

이 됩니다!


3. 변수 할당이란?

변수 할당 : 변수 값을 지정해주는 행위이며, "="의 기호를 써서 할당한다.

*컴퓨터에서 "="는 "할당하다"를 의미하고, 수학에선 등호(=)의 의미가 됩니다.

greeting = "hello, world"

4. 컬렉션 자료형

  • 리스트(List)
  • 튜플(Tuple)
  • 딕셔너리(Dictionary)
  • 셋(Set)

 

  • 리스트(List)
    • 개념 : 여러 개의 항목을 순서대로 저장할 수 있는 가변 자료형
    • 표현법 : 대괄호[] 및 쉼표로 구분됨
    • 특징 : 순서가 있고, 가변적이며, 중복된 요소를 가질 수 있음
#리스트, 가변 (문자형은 수정 불가능)
number_list = [3,4,3.14,5,7]
print(number_list)
print(number_list[0])
print(number_list[0:2])
print(number_list[2:4])

print(number_list[0]) : 첫 번째 값 들고 오기
print(number_list[0:2]) : 첫 번째, 두 번째 값 들고 오기
print(number_list[2:4]) : 두 번째, 네 번째 값 들고 오기

#첫 번째 숫자 바꾸기
number_list[0] = 9
print(number_list)
#결괏값 = [9, 4, 3.14, 5, 7]


#값 추가하기
number_list.append(100)
print(number_list)
#결괏값 =[9, 4, 3.14, 5, 7, 100]


#값 지우기
number_list.remove(3.14)
print(number_list)
#결괏값 = [9, 4, 5, 7, 100]


#정렬하기
number_list.sort()
print(number_list)
#결괏값 = [4, 5, 7, 9, 100]


#len
print(len(number_list))
#결괏값 = 5

 

  • 튜플(Tuple)
    • 개념 : 리스트와 유사하지만, 한 번 생성되면 수정할 수 없는 불변 자료형
    • 표현법 : 소괄호()
    • 특징 : 순서가 있고, 불변적이며, 중복된 요소를 가질 수 있음
#튜플(Tuple), 불변
number_tuple = (3,1,5,4)

print(number_tuple)
#결괏값 = (3, 1, 5, 4)


print(number_tuple[0])
#결괏값 = 3


print(len(number_tuple))
#결괏값 = 4

 

  •  딕셔너리(Dictionary)
    • 개념 : 키-값 쌍(Key-value Pair)으로 데이터를 저장
    • 표현법 : 중괄호{} 및 각 키와 값은 클론(:)으로 구분
    • 특정
      1. 순서가 없으며, 키를 통해 접근함
      2. 가변적
      3. 키는 유일해야 함
      4. 값은 중복될 수 있음
#딕셔너리(Dictionary)
name_dict = {"이름":"민경", "성":"배"}
print(name_dict)
#결괏값 = {'이름': '민경', '성': '배'}


print(name_dict["이름"])
#결괏값 = 민경


#딕셔너리에 내용 추가하기
name_dict["나이"] = 25
print(name_dict["나이"])
#결괏값 = 25


#삭제하기
del name_dict["나이"]
print(name_dict)


#키 목록 확인하기
print(name_dict.keys())
#결괏값 = dict_keys(['이름', '성'])


#키 값 확인하기
print(name_dict.values())
#결괏값 = dict_values(['민경', '배'])

 

  • 셋(Set) 
    • 개념 : 중복되지 않는 요소들의 집합을 나타내는 자료형
    • 표현법 : 중괄호{}
    • 특징 : 순서가 없고, 가변적, 중복을 허용하지 않음
#셋(set), 중복된 값이 없음
number_set = {1,2,3,4,5,5,6}
print(number_set)
#결괏값 = {1, 2, 3, 4, 5, 6}


#셋 추가하기
number_set.add(8)
print(number_set)
#결괏값 = {1, 2, 3, 4, 5, 6, 8}


#셋 삭제하기
number_set.remove(3)
print(number_set)
#결괏값 = {1, 2, 4, 5, 6, 8}


#셋 합집합
number_set_2 = {5,6,7,9,11}
print(number_set.union(number_set_2))
#결괏값 = {1, 2, 4, 5, 6, 7, 8, 9, 11}


#셋 교집합
print(number_set.intersection(number_set_2))
#결괏값 = {5, 6}

5. 명시적 타입 전환

  • Int() : 정수로 변환
  • Float() : 실수로 변환(소수)
  • Str() : 문자열로 변환
  • Bool() : True or False로 변환

 

1. Int() : 정수로 변환

#명시적 타입 전환

## int() : 정수화
### 실수를 정수로 변환
a = 3.14
b = int(a)
print(b)
#결괏값 = 3


### 문자열을 정수로 변환
c = "100"
d = int(c)
print(d)
#결괏값 = 100

 

2. Float() : 실수로 변환

## float() : 실수화
### 정수를 실수로
a = 10
b = float(a)
print(b)
#결괏값 = 10.0


### 문자열을 정수로
c = "3.14"
d = float(c)
print(d)
#결괏값 = 3.14

 

 

3. str() : 문자열로 변환

## str() : 문자열화
a = 10
b = str(a)
print(b)
#결괏값 = 10


print(type(b))
#결괏값 = <class 'str'>

여기서 새롭게 배운 내용이었어요!

강의를 시청하면서 배운 거기 때문에 '그렇구나~' 하면서 공부했는데

결괏값이 강사 님의 내용과 다르더라구요..?

맞게 됐는지 아닌지 모르겠어서, 팀원분들께 여쭤봤더니

print(type(b)) 해보라고 알려주시더라구요

  • Type() : 함수의 유형을 알려줌

그렇게 해서 str()로 제대로 변환 됐다는 걸 확인 할 수 있었습니다!

 

4. bool()

## bool() : None과 빈 문자열 = False , 그 외는 True
bool_test_1 = 0
bool_test_2 = ""
bool_test_3 = "hello"

print(bool(bool_test_1))
#결괏값 = False


print(bool(bool_test_2))
#결괏값 = False


print(bool(bool_test_3))
#결괏값 = True

6. 컬렉션 타입 변환

- 문자열을 리스트로 전환

1. list()

## list() : 문자열을 리스트로 전환
a = "hello"
b = list(a)
print(b)
#결괏값 = ['h', 'e', 'l', 'l', 'o']

 

2. tuple()

## tuple() : 리스트를 튜플로 변환
c = [1,2,3]
d = tuple(c)
print(d)
#결괏값 = (1, 2, 3)

 

3. set()

## set() : 리스트를 셋으로 변환 (중복 제거)
e = [1,2,2,3,4]
f = set(e)
print(f)
#결괏값 = {1, 2, 3, 4}

 


7. 암시적 타입 변환

  • 개념 : Python이 자동으로 데이터를 변환하는 경우
  • 특징 : 일반적으로 숫자형 데이터 간의 연산에서 발생함
# 암시적 타입 변환 : 연산

## 정수와 실수의 연산에서 발생하는 암시적 변환
a = 5
b = 2.0
c = a + b
print(c)
#결괏값 = 7.0


print(type(c))
#결괏값 = <class 'float'>

8. 타입 변환시 주의할 점🚨

  1. 문자열 변환 주의 : Int()를 쓸 때는 숫자여야 합니다!
    • 올바른 예시
a = "123"
b = int(a)
print(b)
#결괏값 = 123
  • 잘못된 예시
c = "abc"
d = int(c)
print(d)
#결괏값 =
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/A.py", line 154, in <module>
    d = int(c)
ValueError: invalid literal for int() with base 10: 'abc'

 

 

2. 정밀도 손실 주의 : Int()를 쓰기 전, 숫자가 실수였을 때 소수점 이하의 값이 날라가는 것을 주의하셔야 합니다.

a = 3.99
b = int(a)
print(b)
#결괏값 = 3

 

3. 암시적 변환의 이해 : 코드의 의미를 명확히 하기 위해 명시적으로 변환하는 것이 좋을 때도 있습니다.


마무리

와~!

오늘 공부한 내용을 이렇게 정리해보니까, 뿌듯하네요

처음엔 Python이 너무 어려워서 '어떡하나,,' 했는데

막상 해보니까 해볼만 했습니다!

뭐든 처음이 두렵고 어려운 법이죠 ☺️

어쨌든 시도를 해봤다는 거고, 해냈다는 게 중요하지 않겠습니까!

 

긴 글 읽어주셔서 감사하고,

열심히 공부해준 저에게 칭찬을 해주고 싶네요!

수고 많으셨습니다 :)

 

인사말

안녕하세요~!

사전캠프도 이번주 금요일이 마지막이네요

아쉽게도 이번주 금요일엔 개인 사정이 있어서 참석은 못 하지만,

SQL의 마지막 문제는 풀어보았답니다!

오늘 공부한 내용도 포스팅 해보도록 하겠습니다!

ps. 부쩍 추워진 거 같으니, 감기 조심하세요 😘


🎁 마지막 연습 문제!

데이터 베이스가 될 파일 내용입니다.
마지막 문제_20241121배민경.sql
0.00MB

 

문제 1. 모든 주문의 주문 ID와 주문된 상품의 이름을 나열하는 쿼리를 작성해주세요!

select p.name, o.id
from products p
join orders o
on p.id = o.product_id;

이제는 "Join"을 어떻게 쓰는지 이해가 된 거 같아요!

막힘없이 쭈르륵 나열한 저를 보니까 기분이 좋았습니다 😋.

팀원분들이랑 대화를 나눴는데 "Join"만 쓸 때는 "Inner"를 내포하는 거라고 하더라구요

그래서

"left join"를 쓰는 게 아닐까 싶은 생각을 했습니다

좀 더 확실한 범위값에서 데이터를 갖고 오는 느낌?으로 이해했거든요 😎

 

문제 2. 총 매출(price * quantity의 합)이 가장 높은 상품의 ID와 해당 상품의 총 매출을 가져오는 쿼리를 작성해주세요!

select p.id, sum(p.price * o.quantity) as total
from products p
join orders o
on p.id = o.product_id
group by p.id
order by total desc
limit 1;

이렇게 킨 코드를 막힘없이 적어내린 저한테 너무 신기했어요 😋

sum이랑 avg랑 count를 쓸 때는 "group by"를 함께 적어줘야 한다는 거!

스스로 인지하고 있다는 느낌을 받아서 기분 좋았습니다

점점 익숙해져 가는 걸지두요? 😏

 

하지만, 틀렸죠?

제가 보여드린 코드는, 데이터가 작아서 가능했던 거였구요

데이터의 크기가 만일 컸더라면

select p.id, SUM(p.price * o.quantity) as 총매출
from products p
join orders o
on p.id = o.product_id
group by p.id
order by 총매출 DESC
LIMIT 1;

이렇게 Sum을 기입하여야 정확히 값을 불러와질 수 있음을 배웠습니다

 

문제 3. 각 상품 ID별로 판매된 총 수량(quantity)을 계산하는 쿼리를 작성해주세요!

select p.name, p.id, o.quantity
from products p
join orders o
on p.id = o.product_id;

저는 이번 문제들의 기준을 "Products" 파일로 작업하였습니다!

기준 파일을 정해놓고 작업을 하니까 편하더라구요!

그래서 막힘없이 코드를 만들어내지 않았을까 싶었어요 😊

 

하지만, 또 실수했죠?

"총 수량"이기 때문에

만일, 데이터 파일이 컸더라면 이번에도 Sum을 활용하는 게 맞았다고 생각합니다.

select o.product_id, SUM(o.quantity) as 총수량
from orders o
group by o.product_id;

 

문제 4. 2023년 3월 3일 이후에 주문된 모든 상품의 이름을 나열하는 쿼리를 작성해주세요!

select p.name
from products p
join orders o
on p.id = o.product_id
where o.order_date > '2023-03-03'
order by p.name desc;

"나열" 보자마자 'order by ~ desc 써야겠다'를 생각해낸 문제였습니다

아직은 SQL과 친해지는 과정이라서 그런지

코드를 짜낼 때마다 즐거움이 퐁~ 퐁~ 올라오네요

역시, 무엇이든지 새롭게 배우고 적응하고 공부한다는 행위 자체가

너무 즐겁고 성장해가는 저의 모습을 볼 수 있어서 좋습니다!

계속 공부하며 성장해나가는 저의 과정과 모습도 잘 담아보겠습니다 😋

 

문제 5. 가장 많이 판매된 상품의 이름을 찾는 쿼리를 작성해주세요!

select p.name, o.quantity
from products p
join orders o
on p.id = o.product_id
order by o.quantity desc
limit 1;

"가장 많이 판매된"이라는 문구를 보고

"limit"를 마지막에 작성함으로써 Best 1를 끌어온 문제였습니다

 

이번에도, Sum을 활용해야 했지 않았나 싶었어요

"가장 많이 판매된"이기 때문에 합해야 한다고 생각하거든요

그래서 팀원분들께 피드백 받은 후 수정하였습니다.

select p.name
from products p
join orders o on p.id = o.product_id
group by p.name
order by SUM(o.quantity) DESC
LIMIT 1;

 

문제 6. 각 상품 ID별로 평균 주문 수량을 계산하는 쿼리를 작성해주세요!

select p.id, avg(o.quantity) as avg_orders
from products p
join orders o
on p.id = o.product_id
group by p.id;

앞서 언급하였던 avg 때도 group by 쓰는 걸 잊지 않았구요

여기서 제가 계속 놓치는 걸 찾았습니다

한 번 오류가 나서 뭐가 문제인지 코드를 천천히 살펴보았는데,

select p.id avg(o.quantity) as avg_orders
select p.id, avg(o.quantity) as avg_orders

두 개의 차이점이 보이시나요?

그렇습니다

제가 계속 콤마(,)를 빼먹어서 오류가 나더라구요

이제부터 알았으니, 다음 코드를 짤 때는 더 신경쓰면서 해야 할 거 같습니다

저의 실수를 이렇게 알게 되어서 다행이에요!

 

오늘의 마지막 문제입니다!

문제 7. 판매되지 않은 상품의 ID와 이름을 찾는 쿼리를 작성해주세요!

select p.id, p.name
from products p
left join orders o
on p.id = o.product_id 
where o.id is null;

여기서 제가 틀린 코드를 짰더라구요..

지금 보고 계시는 코드는 수정이 완료된 코드구요.

이전에는

select p.id, p.name
from products p
join orders o
on p.id = o.product_id 
where o.quantity is null;

이렇게 작성하였습니다.

생각을 해보니까,

지금 데이터 파일의 크기가 작아서 가능한 거고,

실제로 보는 데이터들은 파일 크기가 클 테니까

명확한 범위값을 주는 게 맞다고 생각합니다!

이 부분을 간과하고 있었던 거 같아요

이제라도 알았으면 됐죠 😋


마무리

최근에 새로운 팀원분이 오셨는데

다른 데서 조금은 배우고 오셨다 하셨거든요

그 분의 데이터를 바라볼 때 관점과 저의 관점을 비교할 수 있어서

너무 좋았습니다

저의 부족한 관점이 무엇이고, 데이터를 바라볼 때 접근법을 어떻게 해야 할지

생각할 수 있었던 기회였거든요 😋

차차 발전해가고, 여럿 사람들과 대화를 많이 나누고 싶습니다

서로 발전해나갔으면 좋겠어요 🤗

 

이제 다음주부터는 본 캠프 내용으로 찾아뵙겠습니다!

감사합니다 🤗

 

<새롭게 알게 된 것들>

1. "Join"은 "Inner"의 개념을 내포하고 있음

2. 데이터 값이 클 때를 생각해야 함

3. left join을 잘 활용해보자!

4. "총", "모든"이 들어갈 땐 Sum을 활용하여 데이터 명확히 끌고 오기! 

인사말

안녕하세요!

벌써 SQL 걷기반의 마지막 퀘스트를 푸는 날이 왔네요

시원하면서도 섭섭합니다!

더 공부하고 싶고 더 알아가고 싶은데 걷기반 퀘스트는 끝이네요

본 캠프 가서 더 배우면 되겠죠! 😊


9) 💪🏻 아프면 안됩니다! 항상 건강 챙기세요!

데이터 베이스가 될 파일 내용입니다.
9) 아프면 안됩니다! 항상 건강 챙기세요!_20241120배민경.sql
0.00MB

 

문제 1. 테이블에서 각 성별(gender)에 따른 환자 수를 계산하는 쿼리를 작성해주세요!

select gender, count(id) as count_patients
from patients
group by gender;

 

문제 2. 테이블에서 현재 나이가 40세 이상인 환자들의 수를 계산하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where timestampdiff(year, birth_date, curdate()) >= 40;

여기서 새롭게 알게 된 게

curdate() current_date()같은 거라고 하더라구요

이렇게도 쓰는구나를 알 게 되었습니다!

 

문제 3. 테이블에서 마지막 방문 날짜(last_visit_date)가 1년 이상 된 환자들을 선택하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where timestampdiff(year, last_visit_date, curdate()) >= 1;

이제는 날짜를 계산할 때 timestampdiff()를 쓴다는 게 바로 떠올라서

기분이 굉장히 좋았습니다. 😉

'제대로 이해를 했구나!' 싶더라구요 ㅎㅎ

 

문제 4. 테이블에서 생년월일이 1980년대인 환자들의 수를 계산하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where birth_date like "198%";

like 활용할 수 있다는 게 좋았던 문제였습니다

다른 팀원분께서는 이렇게 표현하셨더라구요

SELECT COUNT(*) AS 환자수
FROM patients
WHERE birth_date BETWEEN '1980-01-01' AND '1989-12-31';

같은 문제더라도 다른 방식으로 코드를 짜서 결과값을 낼 수 있다는 게

재밌다고 느껴진 대화였습니다 ㅎㅎㅎ


10) 👆🏻 이젠 테이블이 2개입니다.

데이터 베이스가 될 파일 내용입니다.
10) 이젠 테이블이 2개입니다_20241120배민경.sql
0.00MB

 

문제 1. 현재 존재하고 있는 총 부서의 수를 구하는 쿼리를 작성해주세요!

select count(name)
from department;

 

문제 2. 모든 직원과 그들이 속한 부서의 이름을 나열하는 쿼리를 작성해주세요!

select * from employee as e
left join department as d
on e.department_id = d.id;

새로운 개념이 나와서 몇 시간을 고민했는지 모르겠더라구요

"Join"이라는 걸 처음 접하게 되었습니다!

테이블이 두 개지만 함께 데이터를 불러오고 싶을 때, "Join"를 쓴다고 하더라구요

"Join"도 종류가 다양했습니다.

그중에서 자주 쓰는 게 "Left join"라서 정리를 해보았습니다.

 

**Left Join**은 두 테이블을 결합할 때,

왼쪽 테이블의 모든 행을 유지하고,

오른쪽 테이블의 일치하는 행을 포함하는 방식으로

데이터를 가져온다는 것을 의미합니다.

따라서,

왼쪽 테이블에 있는 모든 행이 항상 결과에 포함되는 것이죠

오른쪽 테이블에 일치하는 데이터가 없는 경우는 NULL 값으로 채워진다고 합니다!

출처 : Chat GPT

예)

select * from employee as e
left join department as d
on e.department_id = d.id;

"From" 뒤에 오는 파일이 기준이 되는 테이블이 되는 거죠

"left join" 뒤에 오는 파일이 "From" 뒤에 오는 테이블과 일치하는 행을 데리고 오는 거구요

이걸 이해하는데 2시간이 걸렸습니다. 🤔

이해를 하지 못하니까 시작을 못하겠더라구요

그래서 오래 걸렸던 거 같아요

또한

처음 배울 때, 확실히 잡고 가는 게 나중에도 활용성이 높다고 생각을 해서

머리 쥐어뜯으며 공부했습니다 😂

 

어쨌든 해냈다는 게 중요한 거죠 😋

 

문제 3. '기술팀' 부서에 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

select e.name, d.name
from employee e
join department d
on e.department_id = d.id
where department_id = 103;

"기술팀"의 id가 103이라서 저는 103으로 표시하여 원하는 결과값을 만들어냈습니다!

다른 팀원분들은 '기술팀'으로 서술하셨더라구요!

문자로도 되고, 숫자로도 표시가 된다는 게 재밌었습니다 😋

그리고

"Join"을 쓸 때 "On"을 이용해서 조건을 줄 수 있어요!

기준이 되는 employee 파일과, 포함이 되는 department 파일의 공통되는 행의 내용이

Id와 department_id였기 때문에 "on" 뒤에는 "e.department_id = d.id"로 적어주시면

공통되는 department 값이 불러와집니다!

이때 "e.", "d."는 employee(=파일명)의 "e", department(=파일명)의 "d"입니다!

 

문제 4. 부서별로 직원 수를 계산하는 쿼리를 작성해주세요!

select d.name, d.id, count(e.department_id) as count_departments
from department d
join employee e
on d.id = e.department_id
group by d.id;

이번에는 알고자 하는 주요 내용이 "부서별" 직원 수이기 때문에

기준이 되는 파일을 "department"로 했습니다!!

그리고, count()를 쓸 때는 group by와 함께 쓰는 것도 잊지 말아주세용!

 

문제 5. 직원이 없는 부서의 이름을 찾는 쿼리를 작성해주세요!

select d.name
from department d
join employee e
on d.id = e.department_id
where e.department_id is null;

직원이 없는 부서가 없었기 때문에 결과값은 0이 나왔습니다.

이때 "Null"을 사용할 때 "="을 쓰면 원하는 값이 나오는 게 아니라 그냥 Null로 나오는 거더라구요

그래서 "Null"을 쓰실 때는 "Is"로 써주시길 바랍니다!

저는 여기서 "="을 썼죠!

이렇게 하면 안된답니다 😋

 

문제 6. '마케팅팀' 부서에만 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

select e.name
from employee e
join department d
on d.id = e.department_id
where d.id = 102;

 


마무리

이렇게 오늘도 SQL 공부가 마무리 되었습니다!

오늘의 에러 사항은 "Join"을 이해하는 데에 있었습니다!

자주 사용되는 코드라고 하니까, 공부를 더 해봐야겠어요!

 

오늘도 새롭게 배우고, 깨닫게 되니까 도파민 뿜뿜해서 좋았습니다 ㅎㅎ

내일도 화이팅! 

이제 다음주 월요일(11/25)부터는 본 캠프가 시작되기 때문에

12시간 공부하게 될 예정입니다!

지금 것보단 훨씬 배운 내용이 많아질 걸 생각하니까, 얼른 공부하고 싶어지네요 😋

오늘 하루도 수고 많으셨습니다!

 

감사합니다!

 

<새롭게 배운 것들>

1. join ~ on ~ : 다른 테이블에서 데이터를 찾아올 때와 조건

2. Null을 활용하게 될 땐 이퀄(=)이 아닌 "Is"로 쓸 것

인사말

안녕하세요!

벌써 공부한지 일주일이나 됐네요! 시간이 정말 빠른 거 같습니다 ㅎㅎ

오늘도 공부한 내용을 포스팅해보도록 하겠습니다.

그리고, 오늘은 멘탈이 붕괴되었던 7번 8번 퀘스트였습니다..

많이 어렵더라구요 😥

아직은 모르기 때문에 어렵다고 생각을 해요!

알아가다 보면 쉽게 할 수 있지 않을까 싶어요😋


7) 😠 랭크게임 하다가 싸워서 피드백 남겼어요…

7) 랭크게임 하다가 싸워서 피드백 남겼어요.sql
0.00MB

문제 1. 테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!

select satisfaction_score
from feedback
order by satisfaction_score;

결과값

기본적으로 SQL에서는 내림차순(desc)로 돼 있다고 해서 한 번 desc를 적지 않고 정렬해봤습니다!

정렬할 때order by를 쓴다는 것을 다시 한 번 더 확인 할 수 있었던 문제였네요~!

 

문제 2. 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!

select user_name, max(feedback_date)
from feedback
group by user_name
order by user_name;

문제에 "최신"을 힌트삼아서 MAX(최댓값, 최근값)을 활용하여 해결하였습니다!

저번 시간에도 MAX를 활용하여 최근값을 구했었던 기억이 나서 반가웠던 문제였습니다~!

Max와 함께 group by도 써서 특정 컬럼에 대한 최근값을 불러올 수 있었습니다.

group by는 지정된 컬럼을 기준으로 데이터를 그룹화하는 것을 뜻하더라구요

다시 한 번 개념을 재정비 할 수 있어서 좋았어요!

 

문제 3. 테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!

select count(*)
from feedback
where satisfaction_score=5;

SQL 강의 때 봤었던 count() 코드!! 오늘 써보았습니다!

이제 Where문은 익숙하게 잘 다뤄서 너무 재밌네요 😜

count() 함수 뒤에는 as를 붙여서 컬럼 명을 지어주어야 한다는 걸 깜빡했어요!

as가 없으니까 count(*)로 컬럼 명이 생성되었네요 🤣

 

문제 4. 테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!

select user_name, count(*) as 'top 3'
from feedback
group by user_name
limit 3;

이번에는 count(*) as를 써주어서 top 3라는 컬럼을 생성하였습니다!

여기서 Limit를 처음 알게 되었는데요!

영단어 뜻대로 3개로 한정지어서 값을 표현해주는 코드라고 하더라구요

새롭게 배웠습니다!

 

문제 5. 테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!

select feedback_date, avg(satisfaction_score) as avg_satisfaction_score
from feedback
group by feedback_date
order by avg_satisfaction_score desc
limit 1;

7번째 퀘스트의 마지막 문제입니다!

"평균", "만족도 점수가 가장 높은", "날짜"가 주요 단어인 거 같죠??

평균을 구하는 avg()와 as를 붙여 컬럼명을 지어주고,

group by를 써서 feedback_date의 데이터를 그룹화 해주고

order by를 써서 정렬 해주었습니다!

그리고 limit를 써서 가장 큰 값 한 가지를 가지고 온 결과값입니다!


오늘의 마지막 문제인 8번 퀘스트를 포스팅 시작하겠습니다

8) 🥼 LOL을 하다가 홧병이 나서 병원을 찾아왔습니다.

데이터 베이스가 될 파일 내용입니다.
8) LOL을 하다가 홧병이 나서 병원을 찾아왔습니다.sql
0.00MB

 

문제 1. 테이블에서 전공(major)가 성형외과인 의사의 이름을 알아내는 쿼리를 작성해주세요!

select name
from fire
where major="성형외과";

 

문제 2. 테이블에서 각 전공 별 의사 수를 계산하는 쿼리를 작성해주세요!

select major, count(id) as `의사 수`
from fire
group by major;

여기까지는 무난하게 해결하였던 문제들이었습니다!

문제는 여기서부터 너무 어렵더라구요 😥

 

문제 3. 테이블에서 현재 날짜 기준으로 5년 이상 근무(hire_date)한 의사 수를 계산하는 쿼리를 작성해주세요!

select count(id) as `의사 수`
from fire
where hire_date <= current_date()- interval 5 year;

날짜 계산을 할 때 Interval 함수를 쓴다고 하더라구요

이번에 새롭게 알게 된 함수였습니다.

그리고

"현재 날짜 기준"이라고 하였으니, Current_date() 함수를 활용하여 문제를 해결하였습니다!

 

대망의 8번째 퀘스트의 마지막 문제! 

저는 여기가 제일 어려웠습니다 😥

 

문제 4. 테이블에서 각 의사의 근무 기간을 계산하는 쿼리를 작성해주세요!

select name, hire_date, 
timestampdiff(year, hire_date, current_date()) as `근무 기간(년)`,
timestampdiff(month, hire_date, current_date()) as `근무 기간(개월)`,
datediff(current_date(), hire_date) as `근무 기간(일수)`
from fire;

오늘 새롭게 알게 된 함수가 굉장히 많았고, 그만큼 머리가 많이 아팠습니다,,

timestampdiff(year or month, 컬럼명, current_date()) as 새롭게 만들어질 컬럼명

이 함수를 새롭게 알게 되었습니다!

MySQL에서만 사용되는 함수라고 하시더라구요

그래서

MySQL에서 날짜를 계산할 때는 timestampdiff와 datediff를 활용하면 될 거 같습니다!

일수를 계산할 때는 datediff를 쓰는데, timestampdiff와의 차이점이 timestampdiff는 최근 날짜가 뒤로 가고,

datediff는 최근 날짜가 앞에 있다는 걸 발견하였습니다.


마무리

오늘은 평소보다 더 시간이 많이 걸렸던 거 같아요

너무 막막했습니다.. 알듯 말듯하는 이 느낌이 답답해서 힘들더라구요

그래도 팀원들과 소통하여 모르는 것도 좁혀가고 배워가서 재밌었습니다!

감사합니다!

 

<새롭게 배운 것들>

1. limit : 표시하는 결과값을 제한함

2. Interval : 날짜를 계산할 때 쓰이는 함수

3. timestampdiff : 년, 개월로 날짜를 계산할 때 쓰이는 함수

인사말

 

안녕하세요~ 다들 주말 잘 보내셨나요?

한 주의 시작을 알리는 월요일이 다가왔습니다!

월요일이 제일 집중이 안 되는 날인 거 같아요 ㅠㅠ

그래도!

오늘도 공부를 했기 때문에, 공부한 내용을 포스팅하도록 하겠습니다.


데이터 베이스가 될 파일 내용입니다.
5) 공부하다보니 팀 프로젝트 시간이 왔어요!_20241118 배민경.sql
0.00MB

 

문제 1. 테이블에서 AWS 예산이 40000 이상 들어간 프로젝트들의 이름을 선택하는 쿼리를 작성해주세요!

select name from project where aws_cost >= 40000;

select 칼럼명 from 파일명 where 조건이 들어가는 열 >= 40000;

이제는 작문하는 데에 조금 익숙해져서, 아는 게 나온다면 문제를 분석하게 되더라구요

문제를 잘 읽어보면 작문을 어떻게 해야 할지 대충 짜여집니다!

"AWS 예산, 40000 이상, 프로젝트들의 이름을 선택"에 집중하여 작문해주었습니다!

 

문제 2. 테이블에서 2022년에 시작된 프로젝트를 선택하는 쿼리를 작성해주세요! 단, start_date < ‘2023-01-01’ 조건을 사용하지 말고 쿼리를 작성해주세요!

 

select name from project where start_date not like '2023%';

select 컬럼명 from 파일명 where 조건이 들어가는 열1 not like '2023%';

처음에는 이렇게  작성을 하고, 팀원분들과 대화를 나눴을 때 다른점을 발견했습니다!

 

select * from team_projects where start_date like '2022%' ;

2022년이 하나이기 때문에 "like"로도 표현할 수 있다는 점을 배워갔습니다!

 

문제 3. 테이블에서 현재 진행중인 프로젝트를 선택하는 쿼리를 작성해주세요. 단, 지금 시점의 날짜를 하드코딩해서 쿼리하지 말아주세요!

수정 전

select name from project where start_date < '2023-11-18' and end_date > '2023-11-18';

 

수정 후

select * from team_projects where start_date <= current_date() and end_date >= current_date();

이번에도 제가 몰랐던 단어가 나왔습니다.

바로 "하드코딩"이라는 건데요!

 

하드코딩이란?

데이터를 소스 코드 내부에 직접적인 형태로 입력하는 것을 의미합니다.

 

제가 수정 전에 '2023-11-18'를 직접 썼던 게 하드코딩이라 할 수 있는 거죠!

 

그리하여

팀원들과 대화 끝에 "current_date"가 오늘 날짜를 의미한다는 것을 배우고,

적용하여 수정하였습니다!

 

새로운 걸 많이 배워가는 오늘이네요!

 

문제 4. 테이블에서 각 프로젝트의 지속 기간을 일 수로 계산하는 쿼리를 작성해주세요!

select datediff(end_date, start_date) as "프로젝트 지속 기간 일 수" from project;

막혔습니다!

여기서 30분 이상을 고민하고 있었어요!

인터넷에서 찾아보아도 뭐라는 건지 이해가 되질 않더라구요

그래서

팀원분들께 "datediff"를 찾았는데 어떻게 작성해야 하는지 모르겠다고 물어보고

해결하였습니다!

datediff(컬럼명1, 컬럼명2) 이렇게 써야 하더라구요

저는 그것도 모르고 날짜로 적고 있어서 나오지 않았던 거였습니다. 🤣

그리고!

datediff에 있는 컬럼명1의 값이 컬럼명2보다 작을 시, 마이너스 값이 나온다고 하더라구요

직접 해봄으로써 눈으로 확인하였습니다!

 

5번째 퀘스트의 마무리

오늘은 DATEDIFF(end_date, start_date)과 current_date() : 오늘 날짜를 새롭게 알게 된 퀘스트였습니다!

알아갈 수 있고 알아야 하는 작문이 많아서 너무 재밌습니다!

언젠가 자연스럽게 우다다다 작성하고 있는 제가 있겠죠? 😋


오늘의 마지막 공부인 6번째 퀘스트 포스팅, 시작합니다!

데이터 베이스가 될 파일 내용입니다.
6) 팀 프로젝트 열심히 했으니 다시 놀아볼까요!_20241118배민경.sql
0.00MB

 

문제 1. 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)

select name, region, rating, rank() over(order by rating desc) as "순위"

from lol;

"레이팅 순위를 계산하는 쿼리", "전체 지역 기준", "순위는 레이팅이 높을수록 높아야 한다."

문제에서 힌트를 얻어서 작문을 완성하였습니다!

그리고 새롭게 알게 된 표현!

"rank() over(order by 컬럼명 desc)"입니다.

컬럼명을 기준으로 높은 순으로 랭크를 매겨준다는 작문이었습니다!

 

문제 2. 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요.

select name

from lol

where join_date = (select max(join_date) from lol);

너무 어려웠습니다..

어떻게 해야 할지 모르겠더라구요

"가장 늦게 게임을 시작한 유저의 이름"

'가장 늦게..?'에서 조금 생각이 멈췄습니다.

그러다 최근에 SQL의 강의를 들었는데 Min과 Max의 내용이 있었거든요!
그래서 그걸 쓰면 되겠다! 싶었지만 작문을 어떻게 해야할지 모르겠더라구요

팀원분들과 대화를 나눈 후 작성할 수 있게 된 문제였습니다!

where join_date = (select max(join_date) from lol);

 

문제 3. 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!

select name, region, rating, rank() over(order by region, rating desc) as "순위"

from lol;

"지역별로", "레이팅이 높은 순", "정렬하여 나열"

앞서 문제 1번에서 배웠던 표현을 기반으로 조건을 더 추가해주었는데

되더라구요!! 쾌감 쩔었던 문제였습니다.

 

문제 4. 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!

select region, avg(rating) as "지역별 평균 레이팅"

from lol

group by region;

"지역별", "평균 레이팅"

문제에서 힌트를 얻고, "지역별"이라는 조건 그룹이 있기 때문에 "group by"를 활영하여 완성하였습니다.

또한, 평균값을 구할 때 SQL 강의를 보면서 배웠던 "avg(컬럼명)"도 활용할 수 있어서 좋았습니다!


마무리

오늘도 월요일을 알리며 퀘스트 2가지를 완료하였습니다!

여전히 모르는 문장이 많아서 어려웠고 헤매었습니다!

그래도 팀원들과 논의 끝에 해결해낼 수 있어서 좋았습니다

모르는 게 산더미라서 막막하지만 점점 없앨 수 있다는 사실도 있기에

오늘도 행복하고 즐거웠던 배움이었습니다!

감사합니다 😊

 

<새로 배운 것들>

1. 하드코딩 : 데이터를 소스 코드 내부에 직접적인 형태로 입력하는 것

2. current_date() : 오늘 날짜

3. DATEDIFF(컬럼명1, 컬럼명2) : 일수 계산

4. over(order by (열 이름) DESC) : 정렬하여 나열

5. rank(칼럼명) : 순위 매기기

6. 컬럼명 = (select max(컬럼명) from 파일명); : 컬럼명에 대한 최댓값 혹은 최근값

인사말

안녕하세요! 오늘도 공부를 한 내용을 포스팅하러 왔습니다!

매일 매일 머리에 열을 느끼며 공부를 하니까

살아있다는 기분도 들고, 해낸 자신을 보니까 뿌듯한 마음이 커지네요!

너무 행복하고 보람찬 요즘입니다!

딴말이지만, 감기 조심하세요! 기온이 롤러코스터를 타고 있습니다.


데이터 베이스가 될 파일 내용입니다.
상품 주문이 들어왔으니 주문을 처리해봅시다!.sql
0.00MB

문제1. 테이블에서 주문 수량이 2개 이상인 주문을 진행한 소비자의 ID만 선택하는 쿼리를 작성해주세요!

select customer_id from orders where amount >= 2;

select 칼럼명 from 파일명 where 조건이 들어가는 열 >= 2;

2개 이상이기 때문에 기호 (>=)를 활용하여 where를 완성시켜주었습니다!

이제 select, from과 where 문장은 익숙하게 다루게 됐습니다!

 

문제2. 테이블에서 2023년 11월 2일 이후에 주문된 주문 수량이 2개 이상인 주문을 선택하는 쿼리를 작성해주세요!

select customer_id from orders where amount >= 2 and order_date >= '2023-11-02';

select 컬럼명 from 파일명 where 조건이 들어가는 열1 >= 2 and 조건이 들어가는 열2 >= '기간';

이번에도 큰 문제점은 없었습니다!

문제2에 있었던 문장을 보며 적절한 기호를 삽입하여 원하는 결과값을 표시하였습니다.

 

문제3. 테이블에서 주문 수량이 3개 미만이면서 배송비가 15000원보다 비싼 주문을 선택하는 쿼리를 작성해주세요!

select customer_id from orders where amount < 3 and shipping_fee >= 15000;

select 컬럼명  from 파일명 where 조건이 들어갈 열1 < 3 and 조건이 들어갈 열2 >= 15000;

이번에도 문제3의 문장을 따라서 수식을 만들어내면 원하는 결과값을 표시할 수 있었습니다.

 

문제4. 테이블에서 배송비가 높은 금액 순으로 정렬하는 쿼리를 작성해주세요!

select shipping_fee from orders order by shipping_fee desc;

select 컬럼명  from 파일명 order by 조건이 들어갈 열 desc;

"높은 금액 순"이라는 새로운 개념이 들어와서 당황했습니다!

아직 내일배움캠프에서 제공해주신 SQL 강의를 듣지 못한 상태기 때문에

팀원분들께 여쭤보며 답을 찾아낼 수 있었습니다.

"order by ~ desc;"가 큰 값 순서대로 정렬하는 명령어더라구요

"order by ~ asc;"는 작은 값 순서대로 정렬하는 명령어입니다.

이렇게 정렬하여 값을 나타내는 방법을 배워가는 3번째 퀘스트였습니다!


오늘의 마지막 공부인 4번째 퀘스트 포스팅, 시작합니다!

데이터 베이스가 될 파일 내용입니다.
이제 놀만큼 놀았으니 다시 공부해봅시다!.sql
0.00MB

 

문제1. 테이블에서 모든 학생의 이름과 트랙을 선택하는 쿼리를 작성해주세요!

select name, track from study;

select 컬럼명1, 컬럼명2 from 파일명;

 

문제2. 테이블에서 Unity 트랙 소속이 아닌 학생들을 선택하는 쿼리를 작성해주세요!

select name from study where track not like 'Unity';

select 컬럼명 from 파일명 where 조건이 들어갈 열 not like 'Unity';

여기서부터 팀원들과의 코드가 달랐습니다!

저는 "Unity"가 아니기만 하면 되니까 "not like"를 활용하여 코드를 완성시켰습니다.

팀원분들은

팀원1 select * from `study` where track <> 'Unity';

팀원2 select * from sparta_students where not track='Unity' ;

팀원3 select * from practice p where not track= 'unity';

이렇게 코드를 완성시키셨더라구요

여기서 "not = <>"라는 것을 새롭게 배우게 되었습니다!

사람마다 완성시킬 수 있는 코드가 다를 수 있다는 걸 알게 되어서 너무 재밌었습니다!😲

 

문제3. 테이블에서 입학년도가 2021년인 학생과 2023년인 학생을 선택하는 쿼리를 작성해주세요!

select name from study where enrollment_year not like 2022;

select 컬럼명 from 파일명 where 조건이 들어가는 열 not like 2022;

이번에도 저는 "not like"를 활용하여 코드를 완성시켰습니다!

다른 항목들을 보았을 때, 공통적으로 2022가 들어가는 것을 확인하고 결과값을 표시하였습니다.

팀원1 select * from `study` where enrollment_year in(2021, 2023);

팀원2 select * from sparta_students where enrollment_year in (2021, 2023) ;

팀원3 select * from practice p where enrollment_year in (2021, 2023);

"IN" 을 활용하여 쓸 수 있다는 것을 배웠습니다!

문제4. 테이블에서 Node.js 트랙 소속이고 학점이 'A'인 학생의 입학년도를 선택하는 쿼리를 작성해주세요!

select name, enrollment_year from study where track = 'Node.js' and grade = 'A';

select 컬럼명1, 컬럼명2 from 파일명 where 조건이 들어갈 열1 = 'Node.js' and 조건이 들어갈 열2 = 'A';


마무리

오늘은 이렇게 두 개의 SQL 퀘스트를 완료하였습니다!

첫날과는 다르게 손에 좀 익은 거 같고, 머리에 개념이 자리 잡은 느낌이네요!

다음에 또 배워 올 배민경이 되도록 하겠습니다!

감사합니다!

 

<새로 배운 것들>

1. "not = <>"

2. "In" : 특정 값

3. "order by ~ desc, asc" : 정렬

 

정리 끝!

안녕하세요~!

퀘스트 2일차로 포스팅 하러 찾아왔습니다!

내일부터는 SQL 연습 내용과 Python 공부를 함께 진행해보려 합니다!

공부량이 많아지는 게 기대가 되네요!


문제1. 테이블에서 제품 이름과 가격만을 선택하는 쿼리를 작성해주세요.

select product_name, price from flex;

Select 컬럼1, 컬럼2 from 파일명;

SQL을 다루면서 느낀점은 "Select"로 시작한다는 걸 깨달았습니다.

불러오고자 할 때는 Select * from 수식이라는 것만 알아두면 유용할 겁니다!

 

문제2. 테이블에서 제품 이름에 '프로'가 포함된 모든 제품을 선택하는 쿼리를 작성해주세요.

select product_name from flex where product_name like '%프로%';

Select 칼럼명 from 파일명 where 범위 열 이름 like '%단어%';

문제3. 테이블에서 제품 일므이 '갤'로 시작하는 모든 제품을 선택하는 쿼리를 작성해주세요.

select product_name from flex where product_name like '갤%';

select 칼럼명 from 파일명 where 범위 열 이름 like '단어%';

 

오늘은 처음 배우는 개념이 나왔습니다! "포함된", "시작하는"이라는 값인데요

처음에는 "포함"이라고 하길래 including을 써보았지만 오류값만 떴습니다그래서 찾아본 결과, "Like"를 SQL에서는 쓴다고 하더라구요!그리하여 원하는 함수값을 도출해냈습니다.또한, 원하는 단어 형태를 "%"를 활용하여 수식을 만들어낼 수 있습니다

  • 포함하는 단어를 끌고 오고 싶을 때 : like '%단어%';
  • 시작하는 단어를 끌고 오고 싶을 때 : like '단어%';
  • 끝 단어를 끌고 오고 싶을 때 : like '%단어';

 

문제4. 테이블에서 모든 제품을 구매하기 위해 필요한 돈을 계산하는 쿼리를 작성해주세요.

select sum(price) from flex;

select sum(합산하려는 컬럼명) from 파일명

SUM은 엑셀에서도 많이 쓰였던 함수였기 때문에 쉬웠습니다!

단지 SQL은 "select"과 "from"이 기본이라는 걸 유념하시면 좋을 거 같네요!


마무리

오늘은 "포함하는", "시작하는", "SUM"을 해본 날이었습니다!

이번에는 오류가 안 떴기에 더 뿌듯했던 하루였어요!

감사합니다!

공부 끝!

1) 돈을 벌기 위해 일합시다!_Script-5_20241114 배민경.sql
0.00MB

 

Select * from '파일 명';

➡파일에 속한 모든 정보를 불러올 때 씁니다!

 

오류가 굉장히 많이 일어났습니다! 왜냐구요?

파일 명을 입력할 때 불러와지지 않더라구요 ㅠㅠ

그래서

작은 따옴표 (')백틱 (`)을 사용해보시고 그래도 안 되면 모두 지우고 해보시면 됩니다! 😋

 

 

select  컬럼명1, 컬럼명2 from '파일 명';

 

이번에는 파일에서 이름포지션을 불러와보았습니다!

이번에도 실패했습니다! 한 번에 불러와지지 않아서 뭐가 문제인가 싶었는데 🤔

(;) 새미클론을 절대 빼먹지 마세요! 마침표 같은 느낌이었습니다!

 

 

select 컬럼1, 컬럼2 from '파일 명' where 범위 컬럼명 between 값1 and 값2;

 

이번에는 범위 값으로 불러보았습니다!

월급이 40000원 ~ 60000원에 해당하는 사람만 불러오려고 저 수식을 입력하였습니다

 

조건부를 넣을 때는 "where"를 쓴다고 하더라구요

"where"를 활용하여 원하는 값을 불러보았습니다!

 

 

select 컬럼명1, 컬럼명2 from '파일 명' where 범위 컬럼명 < "기간";

 

이번에는 기간을 활용하여 원하는 값을 불러보았는데요

처음에는 "before"를 활용하여 값을 불러오고자 하였지만 불러와지지 않았습니다!

그래서 수학의 범위 값(<)으로 입력을 해보니 원하는 값이 불러와지더라구요

 


마무리

오늘은 이렇게 SQL을 처음으로 겪어본 날이었습니다.

무진장 낯설고 어렵고 새로운 개념이라 그런지, 많이 헤매게 되더라구요!

그래도 여기저기서 지식을 얻어 될 때까지 잡고 있었더니 해냈습니다 👏🏻.

 

내일 또 새로운 걸 배우고 포스팅 작성하러 오겠습니다

감사합니다! 👏🏻

1. 데이터베이스(Database)와 테이블(Table)

  • 데이터베이스(Database): 여러 테이블을 포함하는 큰 틀
  • 테이블(Table): 데이터가 행(row)과 열(column)로 구성된 구조로 저장되는 곳.
    • 각 행은 하나의 데이터 레코드를 나타내며, 각 열은 데이터의 속성을 나타냄.

2. SQL 기본 명령어

SQL에서는 데이터베이스와 테이블을 생성하고, 데이터를 조회, 삽입, 수정, 삭제하는 등의 작업을 수행.

 

2.1. 데이터베이스 생성

데이터베이스를 새로 생성할 때는 CREATE DATABASE 명령어를 사용.

CREATE DATABASE 데이터베이스이름;

 

2.2. 테이블 생성

테이블을 생성할 때는 CREATE TABLE 명령어를 사용.

CREATE TABLE 테이블이름 (
    컬럼1 데이터타입,
    컬럼2 데이터타입,
    ...
);

 

예시:

CREATE TABLE students (
    id INT,
    name VARCHAR(50),
    age INT
);

 

해석 : students 라는 이름의 테이블을 생성합니다. 이 테이블에는 세 개의 열이 있습니다:

  • id: 정수형 데이터를 저장하는 열 (INT).
  • name: 최대 50자까지의 문자열을 저장할 수 있는 열 (VARCHAR(50)).
  • age: 정수형 데이터를 저장하는 열 (INT).

 

2.3. 데이터 조회 (SELECT)

테이블에서 데이터를 조회할 때는 SELECT 명령어를 사용.

SELECT 컬럼1, 컬럼2, ... FROM 테이블이름;

 

예시:

SELECT name, age FROM students; 
//students 테이블에서 name과 age 열의 데이터를 조회합니다.

 

  • WHERE 절: 특정 조건에 맞는 데이터만 조회합니다.
    • SELECT name, age FROM students WHERE age > 20;
      //students 테이블에서 age 값이 20보다 큰 학생들의 name과 age를 조회합니다.
  • ORDER BY 절: 조회한 데이터를 정렬합니다.
    • SELECT name, age FROM students ORDER BY age DESC;
      //students 테이블에서 name과 age를 조회하되, age를 기준으로 내림차순(DESC)으로 정렬합니다. 즉, 나이가 많은 학생부터 순서대로 정렬됩니다.
  • LIMIT 절: 조회할 데이터의 개수를 제한합니다.
    • SELECT name, age FROM students LIMIT 5;
      //students 테이블에서 name과 age를 조회하되, 최대 5개의 행만 조회합니다.

 

2.4. 데이터 삽입 (INSERT)

테이블에 새로운 데이터를 추가할 때는 INSERT INTO 명령어를 사용.

INSERT INTO 테이블이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...)

//예시
INSERT INTO students (id, name, age) VALUES (1, 'Alice', 23);

 

 

2.5. 데이터 수정 (UPDATE)

기존 데이터를 수정할 때는 UPDATE 명령어를 사용합니다.

UPDATE 테이블이름 SET 컬럼1 = 값1, 컬럼2 = 값2 WHERE 조건;

//예시
UPDATE students SET age = 24 WHERE id = 1;
//students 테이블에서 id가 1인 학생의 age 값을 24로 수정

 

 

2.6. 데이터 삭제 (DELETE)

테이블에서 데이터를 삭제할 때는 DELETE FROM 명령어를 사용합니다.

DELETE FROM 테이블이름 WHERE 조건;

 

예시:

DELETE FROM students WHERE id = 1
//students 테이블에서 id가 1인 행을 삭제

 


3. 기본 키와 외래 키

  • 기본 키(Primary Key): 테이블에서 각 행을 고유하게 식별하는 열(또는 열의 조합).
  • 외래 키(Foreign Key): 다른 테이블의 기본 키를 참조하는 열로, 테이블 간의 관계.

예시:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    student_id INT,
    FOREIGN KEY (student_id) REFERENCES students(id)
);

 

해석 : orders 라는 이름의 테이블을 생성합니다. 이 테이블에는 두 개의 열이 있습니다:

  • order_id: 정수형 데이터를 저장하는 열로, 이 열이 기본 키(PRIMARY KEY)입니다. 즉, orders 테이블의 각 행을 고유하게 식별합니다.
  • student_id: 정수형 데이터를 저장하는 열로, students 테이블의 id를 참조하는 외래 키(FOREIGN KEY)입니다. 이를 통해 orders 테이블의 각 주문이 어떤 학생과 관련이 있는지를 나타낼 수 있습니다.

4. 집계 함수(Aggregate Functions)

집계 함수는 여러 행의 값을 계산하여 하나의 결과를 반환하는 함수.

 

  • COUNT(): 행의 개수를 셉니다.
    • SELECT COUNT(*) FROM students;
  • SUM(): 숫자 값의 합을 계산합니다.
    • SELECT SUM(age) FROM students;
  • AVG(): 숫자 값의 평균을 계산합니다.
    • SELECT  AVG(age) FROM students;
  • MAX(): 최대 값을 찾습니다.
    • SELECT  MAX(age) FROM students;
  • MIN(): 최소 값을 찾습니다.
    • SELECT  MIN(age) FROM students;

5. SQL 조건문

  • AND: 두 조건이 모두 참일 때 사용합니다.
    • SELECT  * FROM students WHERE age > 20 AND name = 'Alice';
  • OR: 두 조건 중 하나만 참이면 사용합니다.
    • SELECT  * FROM  students WHERE age > 20 OR name = 'Bob';
  • NOT: 조건이 거짓일 때 사용합니다.
    • SELECT  * FROM  students WHERE NOT age > 20;

마무리 말

오늘은 Dbeaver를 다운로드 받고 기본적인 SQL 기초 명령어를 공부하는 날이었습니다.

Dbeaver를 실행해보고 데이터 불러오기까지는 성공하였으나, 명령어 입력 방법을 몰라서 헤매었습니다.

아직 SQL 기초 강의를 시청하지 못한 상태이기 때문에 시청 후엔 활용 가능하다고 생각합니다.

아쉽게도 오늘은 쿼리를 작성하지 못했지만, 내일은 완성작을 가져와서 포스팅 하도록 하겠습니다.

 

감사합니다!

[주제]

생성형 AI 시대를 이해하기 위한 필수 용어 사전 11가지

  • 대형 언어 모델(LLM, Large Language Model)
  • GPT(Generative Pre-trained Transformer)
  • 매개변수(Parameter)
  • 프롬프트 엔지니어링(Prompt Engineering)
  • 토큰(Token)
  • 플러그인(Plugins)
  • GPU(Graphics Processing Unit)
  • 환각(Hallucinate)
  • 일반 인공 지능(Artificial General Intelligence, AGI)
  • 멀티 모달(Multi-Modality)
  • 인간 피드백 기반 강화 학습(Reinforcement Learning from Human Feedback, RLHF)

[아티클 요약]

생성형 AI가 기술적 진보를 이룸과 동시에 일상생활에 깊숙이 차지할 미래를 대비하여 개발자가 알아둬야 할 필수 용어 11가지

  • 대형 언어 모델(LLM, Large Language Model)
    • 광범위한 양의 텍스트 데이터를 학습한 모델을 뜻함
      • 인간의 언어 능력 향상 과정을 생각하면 이해하기 쉬움예) 대형 언어 모델 : 방대한 양의 언어 데이터를 학습 → 기본적인 지식을 습득 → 더욱 정교하고 자연스러운 대화 능력을 갖추게 됨
      • 예) 인간의 언어 능력 항상 과정 : 옹알이 → 다양한 교육 과정, 일상생활 속 대화, 독서 등을 접함 → 이해력, 추론 능력, 대화 수준, 답변의 정확도 향상
  • GPT(Generative Pre-trained Transformer)
    • 인간처럼 말할 수 있도록 작문 실력을 훈련 받은 모델
    • = 작문 실력을 키워 ‘Chat’과 결합하여 이용되고 있음 (ChatGPT)
  • 매개변수(Parameter)
    • 요리할 때 필요한 재료와 같은 의미를 지님
      • 매개변수가 많아질수록 정교한 답을 생성할 수 있음
        • 조정하지 못하면 과적합 문제가 발생할 수 있음
          • 과적합(Overfitting) : 모델이 훈련 데이터에 지나치게 적응해버려 새로운 데이터나 일반적인 상황에 대해서는 오히려 성능이 떨어지는 현상
      • 주의할 점 : 각 매개변수의 가중치를 적절히 조정해야 함(어떤 변수는 고정된 값을 가지도록 편향 시킴).
  • 프롬프트 엔지니어링(Prompt Engineering)
    • 생성형 AI 서비스를 보다 효과적으로 활용하기 위하여 쓰여지는 기술을 의미목적지만 명시되어 있을 뿐, 추가적인 정보가 없어서 기대에 부합하지 않는 계획을 제안할 확률이 높음구체적인 정보를 포함하고 있기 때문에 AI는 이 정보를 바탕으로 구체적인 여행 계획을 제안할 수 있게 됨. 또한 표 형태로 출력을 요청하여 별도의 정리 없이 바로 출력할 수 있음.
    • 예) 효과적인 질문 : “이탈리아 여행을 위한 7일 일정 계획 세워줘. 로마, 피렌체, 베니스를 꼭 방문하고 싶으며, 역사적인 장소와 현지 음식을 경험하고 싶어. 계획표는 표 형태로 작성해줘”
    • 예) 효과적이지 못한 질문 : “이탈리아 여행 계획 좀 세워줘”
  • 토큰(Token)
    • 언어 데이터를 처리하는 기본 단위
    • 예) 단어, 문자, 또는 문장의 일부
  • 플러그인(Plugins)
    • 기존의 소프트웨어나 시스템에 추가적인 기능을 제공하는 독립된 모듈을 의미함
    • 플러그인을 사용하면 프로그램의 기능을 확장하고 개인화 할 수 있음
    • 예) 익스피디아(숙박 및 여행 관련 정보 제공), 웹 브라우저(ChatGPT가 인터넷을 검색할 수 있게 됨), 코드 인터프리터(파일 업로드 및 다운로드 지원)
  • GPU(Graphics Processing Unit)
    • 많은 양의 연산을 동시에 처리할 수 있는 그래픽 카드
      • 병렬 처리 능력이 있음
      • 예) (1+2+3)+(4+5+6)+(7+8+9+10)
  • 환각(Hallucinate)
    • AI도 실수를 할 수 있음. 이 현상을 ‘환각’, ‘할루시네이션’이라고 일컬음예) 정보의 오류 : “세종대왕님은 맥북을 활용하여 한글을 창제했습니다
    • 예) 상황의 오류 : 여행 계획을 짜달라고 요청했을 때, “여행은 참 좋은 것입니다”
    • 예) 비현실적인 내용 : “사과 씨를 심으면 배가 자랍니다”
  • 일반 인공 지능(Artificial General Intelligence, AGI)
    • 현재 널리 사용되는 AI에 해당함
      • 특정 작업이나 기능에 최적화된 인공 지능을 의미
      • 예) 언어 번역, 이미지 인식, 게임 등
      *슈퍼 인공 지능(Artificial Super Intelligence, ASI) : 인간보다 더 똑똑한 인공 지능을 말함
  • 멀티 모달(Multi-Modality)
    • 다양한 형태의 모달리티(텍스트, 음성, 이미지 등)를 입력 및 출력에 제한 없이 활용하는 방식을 뜻함예) TTS(Text to Speech) : 텍스트를 음성으로 변환해주는 기술
    • 예) SST(Speech To Text) : 음성을 텍스트로 변환해주는 기술
  • 인간 피드백 기반 강화 학습(Reinforcement Learning from Human Feedback, RLHF)
    • AI 모델이 특정 환경에서 시행착오를 통해 최적의 행동 방식을 학습하는 과정을 말함
    • 보상(Reward)을 기반으로 교육시킴
      • AI는 인간과 직접적으로 상호 작용하는 서비스이기 때문에 정치적 이슈, 윤리적 문제, 문화적 특성에 대해 부도덕한 사고를 학습하였을 시 심각한 사회적 문제와 갈등을 초래할 수 있어서 꼭 필요한 학습 과정임.

[인사이트]

처음 접해보는 산업 분야이기 때문에 용어에 대한 개념 정리가 필요하다고 생각했습니다.

이번 기회를 통해서 인공 지능(AI)에 대해 더 명확한 개념을 알 수 있게 되었고 AI 중에서도 종류가 많다는 것(AGI, ASI)과 이루고 있는 다른 요소(매개변수, 멀티 모달, 토큰)들도 존재한다는 것을 알게 되었습니다.

 

앞으로 AI와 관련된 산업에서 종사하기 위해선 용어 습득을 기반으로 작업해야 한다는 걸 깨달았습니다.

+ Recent posts