Coding (164)

08
30

건강하게 sql을 하기 위해 필요한 준비

1. 문제의 발단.

  • sql 명령어들은 공식처럼 크게 어렵지 않다. 형태를 외워 놓으면 쓰기 편하고, 잊어버린다고 해도 검색하면 다 나온다. 어떨 때 어떤 명령어를 쓰는지 어렴풋이 알고만 있으면 된다.
  • 하지만 JOIN의 경우는 헷갈린다. 무엇이 어떻게 합쳐지는지 어떤 식으로 돌아가는지 어렴풋이라도 알기 위해서는 정리가 필요하다고 생각했다.

2. JOIN?

  • 여러 개의 테이블들을 합쳐서 데이터를 검색할 때 사용할 수 있다.
  • 각 테이블들은 같은 값을 가지는 '칼럼'을 각각 가지고 있어야 한다.

3. JOIN 명령어의 기본적인 형태

SELECT 가지고 올 테이블.컬럼1, 가지고 올 테이블. 칼럼 2... FROM 기준이 될 테이블 LEFT 혹은, RIGHT 혹은, FULL 혹은 INNER JOIN 비교할 테이블 ON 조건 1, 조건 2...

4. 그림으로 보는 JOIN의 종류

  • 이 그림에 색칠된 부분을 우리는 얻게 된다.
  • 예를 들어, INNER JOIN(위 그림에는 INNER가 빠져있다)을 사용할 때, 왼쪽의 테이블과 오른쪽의 테이블을 겹쳐 보았을 때, 둘 다 에게 공통으로 가지고 있는 값이 있는 부분만 검색할 수 있게 되는 것이다.

5. 예시로 보는 INNER JOIN

T1 :

SHIFT_S NAME
1 Hendrix
1 Mark
3 Yeel
6 Anjeli

T2 : 

ID SHIFT
1 Mon, Tue
2 Wed, Thu
3 Fri, Sat
4 Sun, Mon
5 Tue, Wed
6 Thu, Fir

SELECT T1.NAME, T2.SHIFT FROM T1 INNER JOIN T2 ON T1.SHIFT_S = T2.ID

결과 :

NAME SHIFT
Hendrix Mon, Tue
Mark Mon, Tue
Yeel Fri, Sat
Anjeli Thu, Fir
COMMENT
 
08
27

1. 문제의 발단.

  • sql파일 안에 적어놓은 내용들이 적용이 안된다.
  • sql 파일 안에는 테이블들이 들어 있었다.
  • 하지만 테이블을 DESCRIBE로 조회하면 ERROR 1146 (42 S02): Table doesn't exist라는 오류를 볼 수 있었다.
  • 리눅스(우분투) OS 의 대소문자 구분, 혹은 테이블 이름이 틀리다 등등 다양한 이유가 있었다.
  • 하지만 데이터 베이스도 정확히 지정된 상황이었고, 대 소문자 구분도 상관없음을 확인했다.

2. 해결방안

  • 강제로 sql 파일을 적용시켜 준다.
  • VS code에 sql 파일의 오른쪽 마우스를 눌러보면 경로를 복사할 수 있다. (Copy Path, Copy Relative Path).
  • 이 경로를 복사해서 mysql에서 source 복사한 경로를 입력하면 sql파일을 실행시킬 수 있다.
COMMENT
 
08
26

확실히 테이블로 정보를 적어 놓으니 관리는 편하겠네요. 전 안 입겠습니다.

1. SQL?

  • Structured Query Language를 줄인 말이다.
  • 관계형 데이터 베이스를 다룰 수 있게 되며, MySQL을 설계하며 이를 SQL로 수정하게 된다.

2. Database

  • in memory에 파일을 저장하게 되면 컴퓨터가 꺼지면 사라진다. 그래서 서버에 파일 자체에 저장을 해 놓는다면, 클라이언트가 원하는 정보만 받아 올 수 없고, 모든 정보를 싹 다 가져와야 한다. 그래서 그러한 데이터들을 한 곳에 저장하고 필터링을 해서 필요한 정보만 클라이언트에 주기 위해 만든 것이다.
  • 생긴 모습은 '엑셀'과 같다.

3. SQL과 NoSQL의 미묘한 관계

  • SQL은 관계형 데이터 베이스이다. 그래서 정보를 입력하기 전에 '테이블'에 저장할 데이터의 구조를 짜 놓는다. 그래서 알아보기 편하다.
  • NoSQL은 정보를 입력하기 전이 아닌, 정보를 읽어 올 때 정보에 생김새에 따라 맞는 방식으로 읽어 온다고 생각하면 편하다.
  • 둘 다 각자의 장, 단점이 있다. (속도 적인 측면에서는 NoSQL이 뛰어나기도 하지만, 데이터들의 크기가 크지 않은 경우, 읽어오고 사용하기 복잡한 NoSQL 보다 SQL을 사용한다.)
  • 각각의 상황과 데이터들에 따라 바꿔서 사용한다.

4. MySQL 설치하기.

  1. 우분투를 사용한다면, sudo apt-get update 와 sudo apt-get install mysql-server 로 설치 가능.
  2. 설치가 완료되면 sudo systemctl start mysql로 실행시킨다.
  3. 실행 이후, mysql -u root로 접속한다. 만약 안된다면, sudo mysql -u root로 관리자 권한으로 해보자.
  4. 처음 접속하면 조금 당황스럽다. 커서 앞으로 'mysql>' 이 보이고 엔터를 치면 아래줄로 내려가면서 아무 일도 일어나지 않는다. 잘 실행된 것이니 일단 로그인 비밀번호를 설정해 줄 것이다.
  5. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword'으로 비밀번호를 설정할 것이다. 'yourPassword' 부분에 설정할 비밀번호를 입력해 주자. 이제 이 비밀번호로 접속을 하게 될 것이다.
  6. '\(백 슬레쉬)q'로 접속을 종료할 수 있다. 설정된 비밀번호를 테스트하기 위해 한번 접속을 종료해 보자.
  7. 이제는 mysql -u root -p를 입력해서 접속하자.
  8. 비밀번호를 물어볼 것이다. 잘 입력해주면, 접속이 완료된다.

5. 뭐든지 해 보자!

  • 먼저, 가장 중요하게 알아 두어야 할 것은 ';'이다. 꼭 마지막에 세미콜론을 붙여주자. 안 그러면 계속 줄 바꿈을 하게 된다.
  • 모든 명령은 대문자로 적는다. 투철한 실험 정신으로 소문자로도 적어 보니 작동한다! 하지만 모두 대문자로 적고 있다. 왜 일까..?
  • SHOW DATABASES; 를 입력해 보면 지금 있는 데이터베이스의 목록이 뜬다.
  • 데이터베이스를 만들때는 CREATE DATABASE 데이터베이스 이름; 을 사용한다. 이후 SHOW DATABASES; 로 확인해 주면 되겠다.
  • USE 데이터베이스 이름;으로 데이터베이스를 선택해서 사용할 수 있다.
  • 삭제할 때는 DROP DATABASE 삭제할 데이터 베이스 이름 사용한다.

6. 아주 간단한 연습을 할 때 유용한 명령어

  1. SELECT 필드 이름 : 데이터를 선택한다.
  2. FROM 테이블 이름 : 테이블의 이름 앞에서 어떤 테이블을 받아올지를 정해준다.
  3. UPDATE 테이블 이름 SET 필드 = 값 : 데이터를 수정할 수 있다. 테이블 이름과 필드 이름을 입력해 주어 어떤 데이터를 어떻게 바꿀지 적을 수 있다.
  4. WHERE 필드 이름 조건 : 마치, 필터처럼 작동한다. UPDATE나 SELECT 뒤에 붙어서 특정 값을 만족시키는 데이터만 뽑아낸다.
  5. * : 모든 것. 예를 들어 SELECT * 한다면, 모든 필드를 다 선택하는 것이 된다. 주의해서 사용하자.

7. 필수로 알아야 할 다양한 명령어

https://www.w3schools.com/sql/exercise.asp

 

W3Schools SQL Exercise

I completed all the SQL exercises on w3schools.com

www.w3schools.com

  • 퀴즈를 직접 풀어보면서 자연스럽게 배울 수 있다. 이것이 가장 빠른 방법인 것 같다.
  • 만약 모르겠다면, 오른쪽 아래에 'Show Answer'을 눌러서 확인할 수도 있지만, 왼쪽 텝에 Tutorial 페이지로 연결해주는 링크가 있으니 그곳부터 천천히 읽어보고 오는 것을 추천한다.
  • 영어의 장벽이 무섭다면 번역을 번갈아 보면서 해도 충분하다. 오히려 영어로 보는 게 번역보다 매끄러울 수 있다.
  • 위의 문제들을 충분히 풀어본 후에 터미널 창에서 직접 해 보면 무엇보다 재미있다...!
COMMENT
 
08
25

왜 다이나믹 프로그래밍이 다이나믹 프로그래밍 인 줄 아십니까...?

1. 문제의 발단.

그렇다. 이유는 없다. 멋있어서 붙여진 이름이라고 한다. 그러니 나처럼 왜 다이내믹 이냐?라는 의문을 품고 이유를 찾게 되면 전혀 없으니 다른 방식으로 이해를 해 보려고 한다.

 

2. 기본 원리

  • 큰 하나의 문제를 위해 그 문제를 새부적인 문제들로 나눠서 이전에 작은 문제를 풀었던 답을 이용해 다음에 나올 문제를 풀고, 마지막에 그 결과들을 합쳐서 큰 문제 하나의 답을 도출 해 낸다.
  • 이때, 작은 문제들의 결과를 계속 이용하기 위해 따로 그들을 저장해 놓는다.
  • 이는 재귀함수를 이용할 때 사용했던 메모이제이션(Memoization)을 이용하는 것과 같다.

3. 언제 사용하나요?

  • 큰 문제를 작은 문제들로 나눠서 생각할 수 있는경우
  • 같은 문제를 구할 때, 계속 구할 때마다 답은 같은 경우

4. 다시 돌아온 피보나치

  • 피보나치수열을 이용해 알아보자
  • 피보나치수열의 경우 계속해서 자신이 구했던 값들을 다시 계산해서 그 자리 위치를 맞추어 계산하게 된다.
  • 하지만 이전에 이미 계산한 수를 저장했다가 다시 사용하면 효율을 굉장히 올릴 수 있다.
const fibo = (n, arr = [0]) => {
  // 처음 3 보다 작으면 무조건 1이다.
  if(n < 3) {
    arr[n] = 1;
  }
  // arr에 작게 나눈 문제들의 답(각각의 이전  fibo의 결과들)이 들어가 있다.
  // 만약 찾을 수 없다면?
  if(!arr[n]) {
  // 계산해서 arr에 넣어준다.
    arr[n] = fibo(n - 1) + fibo(n - 2)
  }
  return arr[n]
}
COMMENT