본문 바로가기
국비교육기관/수업

05일차_파이썬기초_딕셔너리 / SQL plus_SELECT_WHERE

by 밀키스 2021. 3. 19.

@21.03.19

@Anaconda3 프롬프트?(터미널?)창을 통해 주피터노트북 테마 바꾸기


말 그대루 그냥 테마나 폰트 글자크기 등등을 바꾸는 것. 일단 pip을 통해 jupyterthemes를 다운 받아주고 변경을 시작하면 된다. 나는

jt -t monokai -f hack -fs 9 -nfs 9 -tfs 11 -T -N


욜케 바꿨다. 테마는 monokai, 폰트는 hack, 글 크기는 9, 노트북폰트는 9, 마크다운폰트크기는 11이며 T,N은 각각 툴바 보이기 이름&로고 보이기이다.

적용 가능한 테마를 보고 싶다면 < jt -l >이라는 명령어를 통해 볼 수 있다.

@딕셔너리

딕셔너리는 Key와 Value를 한쌍으로 갖는 자료형
immutable한 Key와 mutable한 Value로 맵핑되어 있는 순서가 없는 집합
< json >이란 것과 유사하다고 한다.

%mapping => 서로 쌍을 이뤘다는 뜻. (Web에서 많이 쓰이는 표현)

@딕셔너리 - Key

Key값은 중복이 안된다고 했는데, 만일

a = {'name':'세욱','age':27, 'phone':'010-1234-5678','age':25}


와 같은 Key값인 age가 2개인 딕셔너리를 만들었을 때, 실행 결과는

{'name': '세욱', 'age': 25, 'phone': '010-1234-5678'}

 와 같이
마지막에 입력한 Value값으로 쌍이 되어 설정이 된다.

@딕셔너리 값 추가

Dictionary_Name[Key] = Value 한번에 하려면

Dictionory_Nameupdate(Key1=Value, Key2=Value)

 라고하면 된다.

@딕셔너리 값 가져오기

딕셔너리 값은 그냥 Dictionary_Name[Key_Name]이라고 하면 가져올 수 있지만 다른 방법으로는

Dictionary_Name.get(Key_Name)

처럼 < get > 이란 표현을 사용하면 된다.

여기서 2개의 방법은 똑같이 딕셔너리의 키 값을 통해 벨루 값을 불러오지만 get의 경우에는 만일 특정 Key 값에 Value가 할당되지 않은 경우 < None >이라는 값을 반환한다. 물론 딕셔너리에 해당 Key가 없더라도 마찬가지이다.

 

@딕셔너리 - items

items는 딕셔너리 안의 key 값과 value값을 하나의 튜플에 묶어준다.

Dictionary_Nameitems()

 라고 치면

dict_items([(Key1,Value1), (Key2,Value2), (Key3,Value3)])

 

처럼 결과가 나온다.

@딕셔너리 - 예제

딕셔너리를 통한 예제문 이다.

sd = {'김운비':{'Java':60, 'Python':80, 'Web':100},
'나연호':{'Java':100, 'Python':90, 'Web':0},
'김아름':{'Java':90, 'Python':100, 'Web':50}
}
# 새로운 dictionary score_total 만들어주세요.
# java (Key): 세명의 점수의 합, Python (Key): 세명의 점수의 합, Web (Key): 세명의 점수의 합
# 알고리즘, 로직 짜셔서 구현**************
#단, 반드시 반복문을 사용해서 구현
# 결과는 {'Java':250, 'Python':270, 'Web':150} 로 나와야한다.
resul={}
for j in list(list(sd.values())[0].keys()):
    resul[j]=0
    for i in list(sd.keys()):
        resul[j]+=sd[i][j]
print(resul)

일단, 예제에 대한 설명은 위와 같고.

 

여기서 첫번째로 이름에 대한 value 값이 애초에 딕셔너리로 되어있기 때문에 resul에 대한 기본 틀을 처음에 설정해주거나 ( resul = {'Java':0, 'Python':0, 'Web':0} ) 아니면 위처럼 빈공간을 만들고

sd라는 딕셔너리의 Value를 List로 만들어준 다음 첫번째 값인 딕셔너리의 Key값을 List로 변환해주는 식으로 틀을 만들 수 있다.

 

그렇게 특별히 어려운 문제이기 전에 Dictionary에 대한 이해도가 높다면 절대 어렵게 받아들이지 않고 풀 수 있는 문제이다.

 

 

아래는 주피터노트북에 대한 내용이다

06_딕셔너리

 

@21.03.19

Oracle9i Introduction to Oracle9i SQL (한글판) vol1 - 51p~

1. 기본 SQL SELECT문 작성

@SELECT (select list절)

사용법

select -> Column_Name

%Column_Name: 보고자하는 data를 소유하고있는 Column의 이름


from -> table_Name

%table_Name: select에서 적은 Column을 소유하고있는 table

 

%SELECT 키워드 뒤에 *을 입력하면 테이블에 있는 데이터의 모든 열을 표시할 수 있다. ( *: 모든 Column )

@아래에 표기되는 정보

select *

from departments

 

라는 명령어를 입력하면

처럼 "27 row selected"라는 표현. 즉, 행이 27라는 정보가 아래에 나온다. 이는, 부서(department)의 정보가 27줄이라는 뜻,

@Column머릿글 순서 바꾸기

위에서 DEPARTMENT_ID 이는 "Column 머릿글"이라고 불리는데 이는 순서를 바꿀 수도 있다.

ed 명령어를 통해 버퍼를 키고

위처럼 loaction을 앞으로 옮기면

위와 같은 결과가 나온다.

%SELECT문을 작성할때에는  첫번째로 SELECT LIST를 먼저 결정  =>  Column  명시

@SQL문 작성할 때

PARSE 과정
1. 검증
2. 실행계획 (data 가져올 방법)
3. 실행
parsing?? 파싱?? 이란 말이 있다. SQL문을 실행하면 해당 과정을 거쳐 코드가 구동된다.
일단, SQL문은 대소문자를 구별하지 않으나, 만일 최초에 소문자로 작성하고 이에 대해 연관된 구문을 대문자로 짜면
대소문자를 구분하지 않기 때문에 상관은 없으나, 대소문자간 "아스키코드"값이 다르기 때문에, SQL문 또한 대소문자를 구분한다.

%즉, 계속 소문자를 통해 작성하면 후에 같은걸 호출하여도 같은 내용이기에 파싱 과정이 진행되지 않아 성능이 좋다고 한다.

 

@select 문을 통해 직원이름, 봉급을 호출. from을 통해 직원 table에서 가져오면 하단에 107개의 row가 형성된다. 위에서 부서가 27개의 줄인데 정리하면 27개의 부서에 107명의 사원이 있다는 뜻이다.

@Column 에 대한 산술연산

예로 employees table의 salary(월급)에 12를 곱해서 연봉을 나타낼 수도 있고, 월급끼리 더해서 2달치 월급을 나타낼 수도 있다.

즉, 
Column 과 상수에 대한 산술 연산
Column 과 Column에 대한 산술 연산

 

그리고 날짜에 대한 결과는

단, 날짜에 상수를 곱하는 구문은 작동하지 않는다.

@NVL

위와 같이 commission_pct 값이 있는 경우도 있고 아닌 경우도 있다. 이로 인해 월급과 보너스를 곱하면 null값이기 때문에 결국 아무 결과값이 나오지 않는 경우가 있다. 이럴때 쓰는 표현이 "NVL"인데

위 처럼 null값이 있다면 이에 대한 지정값을 정해서 null 대신 대체값으로 대체되어 연산된다.

쓰는 방법은

 

select last_name, 12*salary*nvl(commission_pct,1)
from employees

 

와 같다.

@열별칭 (Alias - Column 이름 바꾸기)

as 라는 표현을 쓴다. 마치 파이썬에서 내가 import한 Library의 이름 값을 변경할 때 쓰는것과 마찬가지로....

사용하기는 위처럼 "as"를 써도되고, 그냥 빈 공간(띄어쓰기)으로 사용해도 이름은 바꿀 수 있다.

단, 사용할때는 "Blank"가 아닌 "as"표현을 사용할 것.

왜냐면 위에서 언급했던 "파싱" 과정에서 as 를 쓰면 그냥 "Alias"구나 라고 컴퓨터가 인식해서 이름 변경 작업을 들어가나 띄어쓰기로 구분하면 table을 먼저 뒤지고 나서 없으면 Alias 과정을 진행한다. 때문에 표현은 as를 쓸것.,

 

여기서 "as"와 "Blank"는 모두 단일문장을 위해서 그리고 출력하면 대문자로 출력하고 싶을 때 쓰는 Alias 방법이다.

 

복수문장(띄어쓰기가 섞인)이고 소문자가 섞여있는 Alias를 원한다면 " "를 사용한다.

사용은 위와 같다.

@리터럴 문자열

리터럴은 select 목록에 포함된 문자, 숫자 또는 날짜를 말한다.
리터럴 문자열은 작은 따옴표 (' ')로 표현하는데 이때는 문자,날짜에만 사용한다. 숫자의 경우는 사용하지 않는다.

그냥 String과 Integer의 사용법 차이... 약간 이런 느낌?? 이다.

@DISTINCT

Distinct 구문은 select를 통해 호출한 Column에서 중복된 값을 제외하고 반환시키는 구문이다.

결과는 12개의 정보가 나온다. 단, 11개의 부서이지 12개의 부서는 아니다. 잘보면 3번째 값이 NULL임을 알 수 있다.

 

%이때, 원레는 27개의 부서가 있지만 중복되는 값을 제외하면 11개의 부서가 나온다. 이는, 16개의 부서가 일을하지 않는 부서라는 결론이 나온다고 한다. 이유는 부서 table에서 가져온게 부서번호이기 때문이다. Departments table의 부서번호를 출력해보면 employees table에 없는 부서번호도 있다. 때문에 근무하고 있는 부서와 아닌 부서를 구분할 수 있는 것이다.

 

여기서 job_id 라는 column을 추가한다면

위와 같은 결과가 나오는데, 이를 "Multiple Distinct"라고 한다. 첫번째 열에서 중복되는 값을 "그룹화"라는 과정을 통해 먼저 정리하고, 그 다음 열에서 중복되는 행을 정리한다.

때문에 위처럼 부서이름은 중복될지라도, 직업이름은 다른 table이 출력되는 결과가 나오는 것.

 

==========================================================================

2. 데이터 제한 및 정렬

@WHERE

% 조건절, 행을 제한하는절   //  조건식이 붙는다. (ex - where column이름 조건)

 

예로 부서번호가 90번인 사원의 이름과 부서이름을 출력한다고 할때는 다음과 같다.

마찬가지로 이름이 "Whalen"인 사원의 이름, 직업, 부서를 출력한다고 할때는 다음과 같다.

- 일단 이름이 문자이기 때문에 작은 따옴표(' ')를 사용하여 이름을 적는다.

- 이름의 경우 table에 저장된 형식을 따른다.(대소문자 구분을 하란 뜻이다.)

- < = >을 기준으로 양옆은 "Blank"(띄어쓰기)를 통해서 구분을 해주는게 중요하다. SQL은 내가 사용하던 파이썬이나     자바와 달리 아스키 코드값을 쌩으로 받아쓰기 때문에 구별해줄 수 있는게 필요하다.

   (물론, 다른 언어들도 띄어쓰기로 구분하는건 필요하다...)

 

%만일 위에서 "last_name"을 "NAME"이라고 Alias했다고 치자. 그러고 나서

where NAME = 'Walen'

이라고 구문을 사용하면 작동하지 않는다. 이유인 즉슨, SELECT구문에서 WHERE가 먼저 작동하고나서 select가 실행되기 때문.

 

%성능적인 측면에서 만일 Column에 대한 연산을 수행할때는 문자로 시작하는게 훨씬 좋다.

ex - Column_Name * 12 처럼..

12가 먼저 시작하면 안좋다는 뜻. 모든 Column은 문자로 시작한다고 인식하고 있다고 함

@단일 비교 연산자.

< = >이나 부등호 처럼 비교연산자. 그중서도 기초적인걸 단일비교연산자라고 함.

다만, 보는것과 같이 같지 않다는 표현은 < != >가 아닌 부등호로 같힌 표현을 사용한다.

 

---------------------------------------------------------------------------------------------------------------------------------

 

@다른 비교 조건

@BETWEEN....AND

위와 같이 WHERE 구문과 함께 사용하여 특정 값의 사이값을 구할 수 있다.

추가적으로

위 사진처럼 문자에 대해서도 가능하다. 위처럼 날짜가 아닌 'a' and 'z'라고 해서 a부터 z사이에 있는 "문자"를 찾는것 또한 가능하지만, 일단 문자 관련해서는 위처럼 '날짜'의 경우를 많이 사용한다고 한다.

 

@IN(set)

< IN >의 구문의 경우 지정한 값이 포함되어 있는 행을 찾아주는 표현이다. 위 처럼 MANAGER_ID가 "100,101,201" 중 하나인 행에 대해서 출력한 결과이다.

 

%이 또한 문자의 경우도 사용할 수 있다고 한다.

반응형

댓글