전체 글 (165)

09
01

키보드가 고장났어요. 저는 이유를 모르겠읍니다.

1. sql 파일의 스키마 적용

  • 아직 mysql을 실행 하기 전이다 => mysql -u root -p < sql파일의 경로 -D 데이터 베이스 이름
  • 물론, 상대 경로를 적절히 이용해도 된다.
  • mysql을 실행 중이다 => source sql 파일의 경로
  • 경로를 잘 못 찾겠다면 VS code의 왼쪽 파일 목록에서 sql 파일에 오른쪽 마우스를 누르면 Copy path(경로 복사)가 있다.

2. env 파일 설정

  • env파일에는 mysql과 연결하기 위한 환경변수가 들어있다.
  • DATABASE_SPRINT_PASSWORD=이전에 정한 mysql 비밀번호를 입력해서 파일을 저장해 둔다.
  • 비밀번호의 앞, 뒤 어디든 따옴표는 필요 없다. 딱! 비밀번호만 적어줘라. 아니면 에러 난다!
  • 당연히, 당신의 mysql 비밀번호를 모두에게 공개할 필요는 없다. github에 공유하기 전에 gitignore파일 안에 같이 레파지토리에 업로드하지 않을 파일들을 정해서 env 파일까지 같이 공유하는 경우를 막자.

3. js 파일에서 작성한 쿼리의 형태

  • 대부분의 쿼리를 날리는 형태는 정해져 있다.
items: {
    get: (callback) => {
      const query = `SELECT * FROM items`;
      db.query(query, (err, result) => {
        callback(err, result);
      });
    },
  },
  • 위와 같은 형태로 get 요청을 보낼 수 있다.
  • 보다시피, items에 있는 모든 정보를 가지고 오게 될 것이다.
  • 요청으로 받아오는 인자를 사용할 수 도 있다.
  • 한번 쿼리를 전송한 후, 받은 결과를 이용해 다음 쿼리를 보내고, 이후 원하는 결과를 얻도록 연속해서 쿼리를 보낼 수 도 있다.
  • post: (id, name, totalNum, callback) => {
          const query = `INSERT INTO average (name_id, totalNum) VALUES (?, ?)`;
          const params = [id, totalNum];
          database.query(query, params, (err, result) => {
            if (result) {
              const query = `INSERT INTO order_items (school_id, classes_id, student_quantity) VALUES ?`;
              const params = average.map((el) => [result.insertId, el.id, el.quantity]);
              db.query(query, [params], (err, result) => {
                callback(err, result);
              });
            }
          });
        },
  • 위의 예시는 먼저 쿼리를 보내서 가져온 데이터를 다시 쿼리를 보낼때 사용한다.
  • 'params'로 데이터를 한거번에 넣을 수 있다. '?' 부분에 params가 들어가게 되며, 형태는 INSERT INTO를 쓸 때처럼 똑같이 순서만 맞추어 주면 된다.
  • 'result.insertId'로 지금의 post요청으로 삽입된 id를 가져올 수 있다.  나머지 형태는 이렇게 된다.
  • {
      fieldCount: 필드의 갯수,
      affectedRows: 영향을 받고 있는 행,
      insertId: 삽입된 ID,
      serverStatus: 서버의 상태,
      warningCount: 경고의 수,
      message: 메시지,
      protocol41: (true or false)
      changedRows: 변경된 행
    }

4. 구조를 이해해 보자.

  • 위의 파일은 '모델' 폴더 안에 있는 서버로 요청을 보내는 함수가 들어있는 파일이다.
  • 이는 데이터 베이스 폴더 안의 연결부로 인해 전송됨을 알 수 있다.
  • app.js 파일에서 전체적인 구조를 파악하는 것이 가장 기초이다. 최상단의 연결부로 모두 가보자.
  •  그리고 config 파일은 각 데이터 베이스에 맞게 서버를 열어주고 있을 것이다.
  • spec 에서 어떤 데이터가 어떤 요청으로 들어오게 되는지 확인이 가능하다. 잘 보면 모든 구조를 파악하기 쉽다.
  • controllers 에서는 서버로 html 요청을 보내고 있다. 어떤 데이터를 어떤 서버 상태로 보내주는지 확인할 수 있다.
  • 이렇게 글로만 보면 잘 이해가 되지 않는다. 직접 파일을 구해서 최상단의 참고로 하고 있는 경로들을 하나씩 들어가 보면서 어떤 역할을 하고 있는지 공부해 보자.
COMMENT
 
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