->
->
cd : 폴더에 들어가는 명령어
pwd : 현재 디렉토리
mkdir : 폴더 생성
cat : 파일을 터미널에 출력
ls : 현재 디렉토리안의 파일 및 폴더 출력
ls -l : 상세 정보 출력
ls -a : 숨긴 파일까지 표시
ls -al : 숨긴 파일까지 상세정보 표시
-> 하나의 환경에는 한 패키지당 하나의 버전만 사용가능한데 만약 2개의 어플리케이션을 개발하는 상황이고 각자 사용하는 버전이 다르다면 이 둘은 동시에 작동할 수 없다. 이것을 가능하게 하고자 독립적인 환경을 만들어 주는것이다.
-> git은 작성한 코드를 로컬에 저장하고 github은 원격 코드 저장소이다. github은 git의 add,commit,push 기능을 이용해 github로 전송할 수 있다.
-> 가상환경으로 독립적인 환경을 만들어준다. git은 로컬 코드 저장소로 변경사항추적 이나 버전관리를 도와준다. 작업폴더를 만들고 git init을 선언해주면 git하고 그 작업폴더가 연결되어 git의 기능을 사용할 수 있게 된다.
->
가상환경 만들기 : conda create --name 이름 python='버전'
가상환경 제거 : conda env remove --name 이름
-> 다른사람과 프로젝트를 공유하거나 환경을 다른 위치에 복사할때 conda create로 가상환경만 딸랑 만들어준다고 공유 혹은 복사가 되지 않는다. 왜냐하면 그때 사용되었던 패키지들을 설치 하지 않았기 때문이다. requirements.txt는 기존 환경에서 사용되었던 패키지를 한번에 설치할수 있게 만든 파일이다.
pip freeze > requirements.txt 로 제작할 수 있다.
-> add -> commit -> push -> pull request
-> 자주 사용하는 것들은 이제 익숙해졌다. find 같은 명령어는 필요할때마다 찾아보면 될 것 같다.
-> 2가지를 소개 하자면
1.pipenv
설치 : pip install pipenv
파이썬버전 : pipenv --python 3.X
가상환경실행 O : pipenv shell
가상환경실행 X : pipenv run
requirements.txt : pipenv lock
2.virtual env
설치 : pip3 install pyenv
가상환경생성 : pyenv virtualenv
가상환경실행 : pyenv activate
가상환경종료 : pyenv deactivate
-> branch 를 사용해 동시에 여러 작업을 독립적으로 진행할 수 있다. 충돌은 merge 방법과 rebase 방법이 있는데 merge는 master 의 충돌부분을 수정한후 commit 처리시켜 HEAD로 뺀 다음에 merge를 하면 된다. rebase도 merge와 마찬가지로 충돌부분을 수정해야 하지만 commit이 아니라 --continue로 처리한다. 처리하고나면 HEAD에 위치하게 되는데 master 보다 앞에 있게 되므로 git checkout master 로 브랜치 전환후 merge 하면 된다.
-> 우분투 파일권한 설정 : chmod [변경될 퍼미션 값][변경할 파일]
읽기 ( r ) : 파일의 읽기권한
쓰기 ( w ) : 파일의 쓰기권한
실행 ( x ) : 파일의 실행권한
EX) rwx - rx - rx 일때 소유자 - 소유자의 그룹원 - 일반유저 형식이다.
퍼미션 값의 계산은 다음과 같다.
r = 4 , w = 2 , x = 1
4+2+1 - 4+1 - 4+1
= 755
퍼미션값은 755가 나온다.
적용하면 $ chmod 755 변경할파일
-> 파일을 복사하여 관리하던 기존의 방법은 같은 내용을 반복해서 저장하기 때문에 용량이 많이 들고 수정된 부분을 일일이 찾아야 하기 때문에 검색도 매우 불편하지만 스냅샷은 수정된 부분만 기록하는 방법이므로 이런 단점들을 보완한 방법이라 보면 된다. git에서 add , status , diff 등으로 스냅샷을 관리할 수 있다.
-> 분산 되어있는 데이터들을 통합하여 보안,저장공간,데이터 일관성 등의 장점이 있기에 데이터베이스가 필요하다. 관계형 데이터베이스는 테이블 형태로 이루어져 있고 키(key)와 값(value)의 관계를 나타낸다.즉, 데이터의 종속성을 관계로 표현하는 것이 관계형 데이터베이스 이다.
-> 관계형 데이터베이스에서 사용되는 언어로 영어문장과 비슷한 구조를 가지고 있어 쉽고 데이터의 연산이 절차에 따라 진행되는것이 아니라 데이터의 집합 단위로 처리된다.
관계는 1:1 , 1:N , N:N , Self Refferencing 이 있다.
1:1 : 테이블간의 레코드의 관계가 1:1인 경우 (ex. 주민번호는 한사람당 하나)
1:N : 레코드 하나가 다른 테이블의 여러개의 레코드들과 관계가 있는 경우(ex. 한사람당 여러개의 핸드폰번호를 사용하는 경우)
N:N : 양쪽 테이블의 레코드들이 서로 관계가 있는 경우 (ex. 고객과 상품의 관계의 경우 한 고객은 여러개의 상품을 선택할 수 있고 상품도 여러명의 고객을 가질 수 있다.)
Self Refferencing : 아직 잘 모르겠다 설명하기 힘들다.
-> DISTINCT , GROUP BY , ORDER BY 등 예제 재현 가능하다.
-> CREATE TABLE , PRIMARY KEY , FOREIGN KEY 로 구현 가능하다.
-> O
-> O
-> INNER JOIN , OUTER JOIN 이 있다. inner은 공통부분만 연결한다. outer은 left에 있는 데이터 테이블은 모두 보존하고 right에 있는 테이블은 흡수(?)당한다.
->
외부단계 : 사용자 관점
개념단계 : 설계자 관점 / 논리적 독립성 : 개념스키마가 바뀌어도 외부스키마에 영향을 미치지 않도록 하는것
내부단계 : 개발자 관점 / 내부스키마가 변경 되어도 개념/외부스키마에 영향을 미치지 않도록 하는것
->
1 정규화 : 각 로우마다 컬럼의 값이 1개만 있어야 한다.
2 정규화 : 테이블의 모든 컬럼이 완전 함수적 종속을 이루어야함. 만약 컬럼 기본키 A , 일반컬럼B , 일반컬럼C 가 있다고 하자. A 와 B는 종속관계, A 와 C도 종속관계인데 B와 C는 종속관계가 아니라면 이것은 2 정규화에 위배되므로 테이블을 쪼개주어야 한다.
3 정규화 : 기본키 외의 다른컬럼이 또다른 컬럼을 결정할 수 없다.
-> 트랜잭션은 데이터베이스의 상태변화를 위한 작업단위를 말한다. 트랜잭션은 확정신호를 알려줘야 데이터베이스에 반영이 된다. 이 확정신호가 바로 Commit이다. Rollback은 트랜잭션중에 지금까지 트랜잭션에 수행한 내용을 전부 취소하겠단 명령어 이다.
->
Acid 는 원자성이다. 하나의 트랜잭션을 구성하는 작업들은 서로 유기적인 관계가 있다. 모든 작업이 완료되어야만 트랜잭션이 끝난다. 하나라도 작업이 실패하면 트랜잭션 자체에 오류가 난다.
Consistency 는 일관성이다. 예를들어 create table user(id, name) 을 생성했다고 한다면 id가 없는 유저는 테이블에 추가할 수 없다.
Isolation 은 독립성이다. 예를들어 1만원이 있는 계좌에서 A라는 사람에게 7천원을 보내는 트랜잭션 , B라는 사람에게 6천원을 보내는 트랜잭션이 있다면 이 트랜잭션은 하나가 먼저 끝나야 한다. 만약 두개의 트랜잭션이 동시에 완료되면 -1만3천원이 되기 때문이다.
Durability 는 지속성이다. 트랜잭션이 성공적으로 수행됬을시 기록이 남는다. 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야 한다.
-> 파이썬의 내장함수와 마찬가지로 여러개의 내장함수가 존재한다. 서브쿼리는 쿼리문을 작성할때 다른 쿼리문을 포함하는것이 서브쿼리 이다.
-> 다중 테이블은 join 을 이용하면 된다.
->
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
테이블 열고, 조건걸고 , 조회하고 , 데이터 정렬한다.
-> O
-> 서브쿼리를 포함해도 실행순서는 변하지 않는다. 서브쿼리는 FROM 과 JOIN에 포함된다.
->
-> 옵티마이저는 DBMS 의 두뇌다. SQL 쿼리문을 작성하고 실행하면 바로 실행이 되는것이 아니라 이 옵티마이저 라는 곳에서 이 실행문을 어떻게 수행하겠다는 여러가지 실행계획을 세우게 되고 각 실행계획을 비교해서 최고의 효율을 가지는 실행계획을 판별하여 그 계획에 따라 쿼리를 수행하게 된다.
옵티마이저의 종류는 크게 2가지 이다.
규칙 순서 리스트이다. 이 순서를 잘 공부해두면 효율적인 쿼리문을 작성하는데 도움이 될 수 있다고 한다.
비용 기반 옵티마이저 : 비용이 최소한으로 나오는 실행계획을 수행한다. 비용을 예측하기 위해 규칙 기반 옵티마이저가 사용하지 않는 테이블, 인덱스, 칼럼 등의 다양한 객체 정보와 시스템 통계정보를 이용한다.
-> 데이터베이스의 테이블에 대한 검색 성능의 속도를 높여주는 자료구조이다. 인덱스는 굉장히 중요한데 그 이유는 검색을 할때 레코드를 처음부터 끝까지 다 읽게 되면 속도가 굉장히 떨어진다. 데이터가 많아지면 더 오래 걸릴것이다. 하지만 인덱스 테이블은 데이터들이 정렬되어 저장되있기 때문에 해당 조건에 맞는 데이터들을 빠르게 찾아낼 수 있다.
-> 만약 DB API가 없다면 DB 접속정보가 바뀔때마다 각 어플리케이션에서 접속정보를 바꿔줘야 한다. 하지만 API가 있다면 각자 어플리케이션마다 접속정보를 바꿀 필요가 없다. 단지 API가 접속정보만 변경해주면 어플리케이션 모두 다 접속정보가 바뀌게 되어 효율적이다.
-> 클라우드 베이스는 원격으로 데이터베이스를 관리하기 때문에 관리 비용이 적게 들어가고 구축 비용이 거의 없다. 그에반해 로컬인 온프레미스 방식은 초기 구축비용이 많이 들고 관리 비용 또한 많이 들어간다. 하지만 로컬은 상대적으로 보안성이 좋으며 이용비용이 없다.
-> 클라우드 데이터베이스의 서버주소 및 id,패스워드를 Dbeaver Connection에 입력하면 된다. 만약 클라우드 서버의 sql이 Postgres라면 그에 맞게 Connection을 해주면 된다.
-> .connect() : DB에 연결 , .cursor() : DB 와 소통할수 있는 메서드, .execute() : 쿼리문을 DB로 넘기는 메소드 , .commit() : 현재 트랜잭션을 commit한다. , .cursor().close() : 커서 닫기를 하지 않으면 메모리 낭비도 많이 되고 동일한 커서를 다른 PL/SQL BLOCK에 사용하면 오류가 나게 된다. , .connect().close() : 마찬가지로 메모리 반환 및 오류를 방지하는 목적으로 사용한다.
-> import sqlite3 하고 connect(), cursor(), execute() 등의 메소드를 이용하면 된다.
-> 각 자료구조에 대한 접근방법을 알고 그거에 맞춰 INSERT INTO VALUES 를 이용해 적재 가능하다.
-> 파이썬 PEP 문서를 참조해 서버에 맞는 DB API를 설치해서 사용하면 된다.
-> psycopg2.connect() 함수를 이용해 서버정보,id,DB이름,password 를 입력하면 된다.
-> pandas로 csv파일을 불러온후 value값을 변수에 담은후 테이블 생성해서 거기에다 INSERT INTO VALUES로 대입하면 된다.
-> import sqlite3 , csv로 다룰수 있다.
->
파일형 : 파일형은 각각의 응용 프로그램이 자신의 데이터를 파일형태로 관리하는것.
서버형 : 디스크에 저장된 데이터를 더욱 사용하기 쉽게 만들어주는것. (ex. 페이스북에서 친구 이름을 검색하면 그 친구의 연락처나 세부사항까지 확인할 수 있다.)
인메모리형 : 메인 메모리에 설치되어 운영되는 방식의 데이터베이스 시스템이다. 디스크 접근식 데이터베이스보다 더 빠른데 그 이유는 디스크 접근이 메모리 접근보다 느리기 때문이다. 인메모리형의 단점은 시스템 파워가 끊어지면 휘발성으로 인해 데이터가 소실되는 단점이 있었는데 최근에 비휘발성RAM의 기술로 인해 단점이 보완 되었다.
-> 데이터베이스를 풀스캔(Full Scan) 검색해서 자료를 출력하게 되면 시간이 굉장히 오래 걸린다. 하지만 B-Tree로 key값을 이용해 값을 빠르게 찾는다. 풀스캔은 테이블의 크기가 커짐에 따라 소요시간도 늘어나지만 인덱스를 사용할 경우 실행시간의 저하는 원만한 곡선을 그리게 된다. B-Tree의 장점은 어느 값이라도 출력하는데에 소요되는 시간이 같다.