728x90

자바 프로젝트를 데이터베이스에 연결하기 위해서는 다음과 같은 단계를 거친다. 

1. JDBC 드라이버 로드  (JDBC java Database Connectivity 자바와 디비 연결을 돕는 api들을 제공해준다)

2. 데이터베이스와 연결

3. SQL문 실행

4. 데이터베이스와 연결 끊음

 

나는 1번부터 막혔다! (이클립스에서 인텔리제이로 넘어오면서 책에 예시가 없어서 다 찾아봐야했다)

maven이나 gradle을 써서 사용하는 드라이버 설정을 해줘야하나 싶었지만 역시나 해결이 안됨.

 

마리아 디비 드라이버 다운 

https://mariadb.com/downloads/connectors/connectors-data-access/java8-connector

+ java 눌러서 다운받은 드라이버넣어줬는데도

Class.forName("org.mariadb.jdbc.Driver");

부터 통과가 안됐다! 드라이버를 못가져오는거같은데...

 

 

해결방법

 

이 블로그를 보고 도움 받았다!

"WEB-INF/lib 안에 mariadb-java-client-2.6.2.jar을 빌드 해주야 해결이 된다" !

https://jung-story.tistory.com/108

 

Avaliable Elements 안에 TEST 안에 있는 

maraidb 파일을 클릭해서 왼쪽 lib 안에 집어넣는다.

 

드라이버 연결 DBManager

 

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DBManager {
    public static Connection getConnection(){


        Connection con = null;

        String server = "서버주소(나는 localhost)";
        String database = "데이터베이스 이름";
        String user_name = "유저네임";
        String password = "비밀번호";

        try {
            Class.forName("org.mariadb.jdbc.Driver");
            System.out.println("드라이브로드 성공");

        } catch (ClassNotFoundException e) {
            System.err.println(" 드라이버 로딩 오류 : " + e.getMessage());
            e.printStackTrace();
        }

        try {
            con = DriverManager.getConnection("jdbc:mariadb://" +
                    server + "/" +
                    database +
                    "?useSSL=false", user_name, password); // SSL 실행 확인
            System.out.println("연결 성공");
        } catch(Exception e) {
            System.err.println("에러 내용 :" + e.getMessage());
            e.printStackTrace();
        }

        System.out.println("con리턴" +con);
        return con;



    }
    //select 수행한 후 리소스 해제를 위한 메소드
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        try{
            rs.close();
            stmt.close();
            conn.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //insert, update, delete 작업을 수행한 후 리소스 해제를 위한 메소드
    public static void close(Connection conn, Statement stmt){
        try{
            stmt.close();
            conn.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

ProductDAO

에서 getInstance를 통해 연결!

package com.saeyan.dao;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import util.DBManager;

import com.saeyan.dto.ProductVO;

public class ProductDAO {
    private ProductDAO(){

    }
    private static ProductDAO instance = new ProductDAO();
    public static ProductDAO getInstance(){
        return instance;
    }

    //c Read u d
    public  List<ProductVO> selectAllProducts(){
        //최근 등록한 상품 먼저 출력하기
        String sql= "select * from product order by code desc";
        List<ProductVO> list = new ArrayList<>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try{
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();


            while (rs.next()){
                ProductVO pVo = new ProductVO();
                pVo.setCode(rs.getInt("code"));
                pVo.setName(rs.getString("name"));
                pVo.setPrice(rs.getInt("price"));
                pVo.setPictureUrl(rs.getString("pictureurl"));
                pVo.setDescription(rs.getString("description"));

                list.add(pVo); //앗 얘를 빼먹었었네!
            }


        } catch(Exception e){
            System.out.println("값 못가져옴:"+e.getMessage());


        } finally {
            DBManager.close(conn, pstmt, rs);
        }
        return list;
    }

}
728x90
728x90

prisma init

 

 

schema.prisma 파일안에 

datasource db {
    provider = "mysql"
    url      = "mysql://유저:비번@localhost:3306/markhouse__"
}

//Prisma Generate는 데이터 모델을 사용하여 Prisma Client를 생성하는 도구입니다. 
//Prisma Client를 사용하면 데이터베이스에 대한 CRUD 작업을 쉽게 수행할 수npx prisma migrate reset 있습니다.

generator client {
    provider = "prisma-client-js"
}

model User {
    id    Int     @id @default(autoincrement())
    email String  @unique
    name  String?
    posts Post[]
}

model Post {
    id       Int    @id @default(autoincrement())
    title    String
    author   User   @relation(fields: [authorId], references: [id])
    authorId Int
}

 

❯ npx prisma db push
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "markhouse__" at "localhost:3306"

MySQL database markhouse__ created at localhost:3306

🚀  Your database is now in sync with your Prisma schema. Done in 136ms

✔ Generated Prisma Client (4.10.1 | library) to ./node_modules/@prisma/client in 44ms

 

| markhouse__생김

 

 

 

 

+

만약 show tables를 실행했을 때 _prisma_migrations 테이블만 보인다면, 아마도 Prisma Migrate를 통해 생성한 마이그레이션 파일로 데이터베이스 스키마를 생성하지 않은 것으로 추정됩니다.

Prisma Migrate를 사용하여 데이터베이스 스키마를 생성하려면 다음과 같은 단계를 따라야 합니다.

  1. prisma init 명령어를 사용하여 Prisma 프로젝트를 초기화합니다.
  2. schema.prisma 파일을 생성하고, 데이터베이스 스키마를 정의합니다.
  3. prisma migrate save 명령어를 사용하여 마이그레이션 파일을 생성합니다.
  4. prisma migrate up 명령어를 사용하여 마이그레이션을 적용하여 데이터베이스 스키마를 생성합니다.

위 단계를 수행하고 나면 show tables 명령어를 실행하여 데이터베이스 내 모든 테이블을 볼 수 있습니다. 만약 테이블이 여전히 보이지 않는다면, DBeaver에서 해당 데이터베이스에 대한 연결을 확인해야 합니다. 데이터베이스 연결이 올바른지 확인하고, 다시 시도해 보시기 바랍니다.

 

 

권한 문제가 생긴다면

 

모든 사용자 조회하는 법 

SELECT user, host FROM mysql.user;

 

사용자 조회해보고

비밀번호 확인해볼 것(모른다면 재설정하기)

ALTER USER '사용자명'@'호스트명' IDENTIFIED BY '새로운 비밀번호';

또는

ALTER USER '사용자명'@'호스트명' IDENTIFIED WITH mysql_native_password BY 'new_password';

 

권한도 확인해볼 것

권한 체크 

SHOW GRANTS FOR 'database_user'@'localhost';

권한 주기

GRANT CREATE, DROP ON *.* TO 'database_user'@'localhost';

 

 

root 모든 걸 볼수 있는거 

다른 권한에서 만든 것도 볼 수 있음 

 

다른 유저로 안들어가졌던 이유는 그저 비번 틀려서 접근 안되었던 거였음. 

 

dbeaver는 그냥 mysql에서 만든 데이터 깔끔하게 보여주는 툴임. 

localhost, 유저, 비번 잘입력하면 연결은 되어서 생성됨

 

추가로 테이블 생성했을 때 mysql터미널에서는 생긴게 보이는데 dbeaver에 바로 반영안되는 이유가 뭐지?

아 dbeaver refresh 버튼 눌러서 새로고침하니까 있다 얏호~!~!~!~

 

 

 

+

 

root는 MySQL에서 가장 높은 권한을 가진 사용자입니다. root 사용자는 모든 데이터베이스와 모든 객체에 대한 모든 권한을 가지고 있습니다. 즉, root 사용자는 MySQL 서버에서 모든 작업을 수행할 수 있습니다.

MySQL에서 root 사용자는 기본적으로 "localhost" 호스트에서만 로그인할 수 있습니다. 이는 보안상의 이유로 설정되어 있습니다. 따라서, 원격 호스트에서 root 계정으로 로그인하려면 특별한 설정이 필요합니다.

그러나, root 계정은 매우 강력하며 위험하기 때문에 일반적으로 MySQL 서버에는 다른 사용자 계정을 만들어 사용합니다. 이렇게 하면 보안상의 문제를 최소화할 수 있습니다.

 

+

 

sudo는 "Superuser Do"의 준말로, 리눅스나 유닉스 시스템에서 일반 사용자가 시스템 관리자(root)의 권한을 일시적으로 얻을 수 있는 명령어입니다.

리눅스나 유닉스 시스템에서 root 계정은 시스템 전체를 관리할 수 있는 권한을 가지고 있으므로, root 권한을 가진 사용자로 로그인하면 시스템 보안에 큰 위험이 따릅니다. 따라서, 보안상의 이유로 일반 사용자가 root 권한을 가지지 못하도록 설정되어 있습니다.

이때, 일반 사용자가 시스템 관리 작업을 수행해야 할 경우, sudo 명령어를 사용하여 일시적으로 root 권한을 얻을 수 있습니다. 이때, 사용자는 자신이 수행하려는 작업을 sudo 명령어 뒤에 입력하면 됩니다.

예를 들어, 일반 사용자가 시스템 업데이트를 수행하려면 다음과 같이 sudo 명령어를 사용할 수 있습니다.

 

+

mysql_native_password는 MySQL에서 기본으로 제공하는 인증 플러그인 중 하나입니다.

이 플러그인은 기존의 비밀번호 인증 방식과 호환되도록 설계되어 있어, 기존에 비밀번호로 인증했던 사용자들도 계속해서 이 플러그인을 사용하여 인증할 수 있습니다.

auth_socket 플러그인과 달리, mysql_native_password 플러그인을 사용하는 경우에는 비밀번호가 필요합니다. 따라서, 해당 사용자의 비밀번호를 잊어버린 경우에는 비밀번호를 재설정해주어야 합니다.

만약 mysql_native_password 플러그인 대신 caching_sha2_password 플러그인을 사용하는 경우에는, 새로운 비밀번호를 설정할 때 IDENTIFIED WITH mysql_native_password 구문을 생략해야 합니다.

 

728x90
728x90

귯귯

 

자동생성 1초씩으로 해봄

 

 

 

이 데이터베이스 사용할거임

use testscedule;

 

이벤트스케줄러 켜져있는지 확인

 

show variables like 'event%';

on으로 켜져있음

 

만약off면 

 SET GLOBAL event_scheduler = ON;

로 활성화

 

(만약 시작될때마다 초기화로 꺼지면 요방법)

https://web-inf.tistory.com/17 

https://bizadmin.tistory.com/entry/mysql-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%9F%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

 



CREATE EVENT if not exists forme  //forme라는 이벤트 없으면 만듦
ON SCHEDULE EVERY 1 second //1초마다 실행
STARTS CURRENT_TIMESTAMP //지금시간부터 시작~
DO
INSERT INTO new_table (name) values ('hi');  //실행할 쿼리문~

 

 

 


SHOW EVENTS ; //이벤트 확인

 

이벤트 삭제

DROP EVENT IF EXISTs forme;

 

 

사실 해도 실행이 안됐었다. 

알고보니 insert에서 막히는 것이었음

만든 table 에서 id가 not null로 빈값 못들어가는데 name만 자꾸 넣어주려니까 안되었던 것이다.

id를 Auto Incremental로 자동 순번 지정되게 수정해주니 

name이 잘 들어갔다. id도 자동으로 들어가고

 

 

*schedule

오타^^+

 

 

 

 

 

https://soccerda.tistory.com/entry/MySQL-Scheduled-Event

 

MySQL Scheduled Event

오라클의 job과 유사한 기능을 지원하는 Mysql DB에는 scheduled Event기능이 있습니다. MySQL 이벤트 스케줄러 및 데이터베이스 작업을 자동화하는 방법에 대해서 기술하겠습니다. MySQL 이벤트는 미리

soccerda.tistory.com

 

728x90
728x90

 

https://stepby-yun.tistory.com/193

 

한시간씩 이자율 넣기 while문 사용, update,order by limit

https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은..

stepby-yun.tistory.com

 

max 랑 min써서 잘들어가긴했는데

order했을때 왜 null떴나 싶어서 

다시 해봄

 

 

 

 

 

 

where 조건문을 잘못넣었네

 

 

 

 

 

 

where interest_amount 

빼니까 잘 들어감

 

 

 

 

없네

근데

다른애들은 where 있고 없고 결과값 똑같은데 뭐지

일단 확실한건 

where 조건문

인데 조건문아니고 테이블만 써서 잘못되긴함. 

 

<수정결과>

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence  order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence order by id desc limit 1) + (select interest_amount from sequence  order by id desc limit 1)),
(select deposit_amount from sequence where id=1)* 0.04 /12;


end while;
end //
delimiter ;

call pro();




select * from sequence;

 

 

 

 

+

참고로 empty set이 무어냐

쿼리 수행 결과가 없다는 뜻

 

 

https://www.tutorialspoint.com/What-is-the-meaning-of-empty-set-in-MySQL-result-set

테이블 조건만으로는 그 값을 찾을 수 없었나봐...

 

728x90
728x90

https://stepby-yun.tistory.com/194

 

MAX MIN order by limit 차이 뭘 쓸지

https://stepby-yun.tistory.com/193 한시간씩 이자율 넣기 while문 사용, update,order by limit https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/1..

stepby-yun.tistory.com

지난 시간

max나 min쓰자~

 

 

 

이번에는 줄어드는 계산식

 

이전코드에서 
빼면 되겠거니~~했는데!

오잉

 

아 이전에는 deposit_amount가 점점 커져서 

MIN 최소값에 이자율곱해서 이자액 구했는데

이제는 줄어들어서 최대값 사용해서 이자금액 구해야하는구나

 

MAX로 바꿈

음...

아 최대값에서 빼주니까 안줄어드는구나

 

최소값(마지막행)에서 빼주기로 변경

 

 

 

굿굿~

 

이자율만 수정하면 끝

 

 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MIN(deposit_amount) from sequence) - (select MAX(interest_amount) from sequence)),
(select MAX(deposit_amount) from sequence)* 0.02;


end while;
end //
delimiter ;

call pro();


select * from sequence;

 

 

 

 

 

 

이거는 order by 랑 섞어서 쓴거. 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do

INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) - (select MAX(interest_amount) from sequence)),
(select deposit_amount from sequence where id =1)* 0.02;

end while;
end //
delimiter ;

call pro();

select * from sequence;

똑같음

 

 

 

 

 

이제 예산이 0 될때까지 해볼게

 

 

끝~

 

 

+

 

참고로 >= 0로 해봤는데

0보다 크거나 같다고 하니까 에러뜸

 

 

이거보니 타입이 unsigned로 되어있는데 

음수값이 나오려고 해서 에러뜨는거라함

 

아하 deposit_amount가 0일때 while문을 돌리면

interest_amount 값을 0에서빼게 되니까

음수값이 들어가게 되는구나

 

https://wwwnghks.tistory.com/122

 

[Mysql] SQL 오류 (1690): BIGINT UNSIGNED value is out of range in 에러 발생시

SQL 오류 (1690): BIGINT UNSIGNED value is out of range in.... 위의 에러 발생 이유는 아래와 같이 컬럼명의 타입이 unsigned 로 되어있고, 음수의 값이 발생되는 경우 발생된다. select (컬럼명 - 100) from..

wwwnghks.tistory.com

 

728x90
728x90

https://stepby-yun.tistory.com/193

 

한시간씩 이자율 넣기 while문 사용, update,order by limit

https://stepby-yun.tistory.com/192?category=554522 mysql while 여러시도.. https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은..

stepby-yun.tistory.com

지난시간~

 

 

select deposit_amount where  deposit_amount order by id desc limit 1

이 order by id dec limit 1

을 사용해서 마지막행 값을 구했었다. 

 

 

우와 max로 썼더니 

null값 사라짐!

 

확실한 건 코드가 짧아져서 너무 좋음ㅋㅋㅋㅋ

구하려는 열과 테이블만 적으면 됨

 

 

 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select MAX(id) from sequence) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select MIN(name) from sequence),
date_add((select MAX(deposit_date) from sequence),INTERVAL 1 hour),
((select MAX(deposit_amount) from sequence) + (select MAX(interest_amount) from sequence)),
(select MIN(deposit_amount) from sequence)* 0.04 /12;


end while;
end //
delimiter ;

call pro();



select * from sequence;

 

 

 

근데 둘의 차이가 뭘까? 뭘쓰는게 좋을까

 

 

단순히 테이블에서 최대값, 최소값을 찾고 싶다면

MAX() MIN() 함수 활용하는게 간단하다

 

최대값 또는 최소값을 갖는 row 열을 찾는 경우,

order by limit 1 을 사용한다.

 

 

 

 

성능으로 봤을 때 min을 쓰는게 좋다

 

 

min은 바로 최솟값을 가져오지만

order by limit1은 실행할 때마다 정렬을 한다. 

 

최악의 경우, 인덱스가 없는경우

min 이 order by limit 1 보다 빠르다

최선의 경우, 인덱스가 있는경우

min 과 order by limit 1 의 성능을 비슷하다

하지만 그래도 order by limit1은 실행할 때마다 정렬을 한다. 

 

 

 

 

 

최대값

select MAX(컬럼) from 테이블;

최소값

select MIN(컬럼) from 테이블;

 

 

 

ORDER BY

정렬할 때 사용

 

asc:오름차순 (안써도 된다)
desc:내림차순

 

limit 가져오는 레코드의 개수를 제한한다

 

 

 

 

 

 

 

https://eyeballs.tistory.com/463

 

[SQL] Min 과 Order By limit 1 중 어느 것을 사용해야 할까?

min 과 order by limit 1 중 어느 것이 더 나은 성능을 보일까? 그래서 어느 것을 사용해야 할까? < 결과 > min 값만 구하는 경우 min 을 사용 min 값을 갖는 row 를 찾아야 하는 경우 order by limit 1 을 사용 <..

eyeballs.tistory.com

https://stackoverflow.com/a/426785

 

MIN/MAX vs ORDER BY and LIMIT

Out of the following queries, which method would you consider the better one? What are your reasons (code efficiency, better maintainability, less WTFery)... SELECT MIN(`field`) FROM `tbl`; SELECT `

stackoverflow.com

https://www.inflearn.com/questions/23797

 

max/min vs. order by + limit 질문 - 인프런 | 질문 & 답변

안녕하세요, 최대값과 최소값 찾는 방법에 대해 질문드려요. 가장 쉬운 방법으로는 MAX() 와 MIN()를 쓰는 방법이 있는데, 수업 중에 선생님께서 order by ___ desc, limit 1 와 order by ___ asc, limit 1도 가르

www.inflearn.com

 

https://sql-factory.tistory.com/634

 

 

 

 

MySQL MIN / MAX 대 ORDER BY 및 LIMIT

다음 쿼리 중 더 나은 방법을 고려할 수있는 방법은 무엇입니까? 당신의 이유는 무엇입니까 (코드 효율성, 더 나은 유지 보수성, 덜 WTFery) ... SELECT MIN(`field`) FROM `tbl`; SELECT `field` FROM `tbl` ORDE..

sql-factory.tistory.com

https://pram.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%BA%BC%EB%82%B4%EA%B8%B0select-ORDER-BY-LIMIT

 

728x90
728x90

https://stepby-yun.tistory.com/192?category=554522 

 

mysql while 여러시도..

https://stepby-yun.tistory.com/191 mysql procedure 프로시저 생성 및 실행 (구본문자 DELIMITER ) while문 해보려는데.. 나와같은 의문을 가지신 분 프로시저 꼭 만들어서 써야돼? https://stackoverflow.com/q..

stepby-yun.tistory.com

프리비어슬리~

 

새로 생긴 행이랑 이전 행 시간을 빼서 1분 이상일때마다

값을 넣어줄까? 했는데 무한insert되고 난리남

 

(이 글의 결론)

1분이 흐를때마다 ->이자증액값을 넣어준다

에서

값넣는다. 1분마다시간증가, 이자증액, 

이렇게

insert할때 한꺼번에 넣는 걸로 식만듦..(저번에 한달씩 증가랑 똑같이 함.)

------

 

 

 

기준 잡기의 중요성..

한 시간씩 증가하고

넣고 먼저 해보자

최대증가한 시간

몇번째 행의 시간이 얼만지 생각! 

 


 

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,'10000000','0');

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) + (select interest_amount from sequence where  interest_amount order by id desc limit 1)),
(select deposit_amount from sequence where id='1')* 0.04 /12;

end while;
end //
delimiter ;

call pro();

select * from sequence;
 


아 다음행에 insert 추가 되는게

마지막 id가 9이니까

 

10까지 뜨는거구나~!!

 

그래도 deposit_amount의 마지막행 10000000을 구해서 이자액 33333을 구했으면 

 

2번째 행에 deposit_amount도 들어갈 수 있는거 아닌가 왜 

 

null값이지? 

 

 

+

 

지금은 한번에 들어가는거니까 

날짜를 추가하고 추가될때마다 이자액이 찍히게 하면 되려나...

 

 

update써서 해보자

 

update 안되는이유 여기서 세팅 설정바꿔줘야함

https://lightblog.tistory.com/193

 

[MYSQL] 에러 번호 1175 Safe Update 해결방법

MySQL에서 쿼리를 실행하다보면 다음과 같은 에러를 마주할 때가 있다. Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable..

lightblog.tistory.com

오마갓 숫자를 ''

여기 넣어서 문자열로 만들어서 쓰고있었네

 

 

 

 

하지만 잘 안됨

use test;
truncate sequence;
set @setTime = (select subtime(now(),'00:02:00'));
insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);





drop procedure if exists pro;
delimiter //
create procedure pro()
begin
DECLARE n varchar(45) default "이소윤" ;

while (select id from sequence order by id desc limit 1) < 10 do
INSERT INTO sequence (deposit_date) select (date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour));

update sequence 
set 
name = n,
interest_amount =  (select deposit_amount where  deposit_amount order by id desc limit 1)* 0.04 /12;




end while;

end //
delimiter ;
call pro();

select * from test.sequence;


 

---

시간 증가만 insert해주고

나머지는 update로 넣어주려 했으나 잘안됨..

그래서 원래 한번에 다 insert한 걸로 수정함

 

중간에 null인거..

 

 

그냥 id가 2인거 조건으로 넣어줌..

이러면 안될거같지만

use test;
truncate sequence;


set @setTime = (select subtime(now(),'00:02:00'));

insert into sequence (name,deposit_date,deposit_amount,interest_amount) values ('이소윤',@setTime,10000000,0);

drop procedure if exists pro;
delimiter //
create procedure pro()
begin
while (select id from sequence order by id desc limit 1) < 10 do


INSERT INTO sequence (name,deposit_date,deposit_amount,interest_amount) 
select 
(select name from sequence order by id desc limit 1),
date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 hour),
((select deposit_amount from sequence where  deposit_amount order by id desc limit 1) + (select interest_amount from sequence where  interest_amount order by id desc limit 1)),
(select deposit_amount from sequence where id='1')* 0.04 /12;


end while;
end //
delimiter ;

call pro();

update sequence 
set deposit_amount = 10000000
where id = 2;


select * from sequence;

 

 

 order by limit 1

를 쓰는 것보다 max가 좀더 빠르다는 얘기를 들음

내일 수정해봐야겠다

 

728x90
728x90

while문 해보려는데..

나와같은 의문을 가지신 분

프로시저 꼭 만들어서 써야돼?

https://stackoverflow.com/questions/12954095/mysql-declare-while-outside-stored-procedure-how

 

mysql DECLARE WHILE outside stored procedure how?

I fairly new to mysql but have MS SQL experience. Is it possible to declare variables and use while statement outside stored procedure? I only found examples where guys doing like this 1. proced...

stackoverflow.com

안된데 따흑.

https://dev.mysql.com/doc/refman/8.0/en/sql-compound-statements.html

^공식문서...

 

 

방금 스택오버 따라서 코드 처보는데

DELIMITER 

이거 맨앞에 넣어야 빨간줄 안뜨네

너 뭐야..

 

공식문서가 말하길,,

"기본적으로 mysql 자체는 세미콜론을 명령문 구분 기호로 인식하므로 mysql 이 전체 ​​저장 프로그램 정의를 서버에 전달하도록 하려면 구분 기호를 일시적으로 재정의해야 합니다.

mysql 구분 기호 를 재정의하려면 delimiter명령을 사용하십시오. //전체 정의를 단일 명령문으로 서버에 전달한 다음 ;프로시저를 호출하기 전에 로 복원할 수 있도록 구분 기호가 변경됩니다 . 이렇게 하면 프로시저 본문에 사용된 구분 기호가 mysql 자체 ; 에서 해석되지 않고 서버로 전달될 수 있습니다."

 

어 그렇구나..(이해못함)

https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html

 

식 사이를 구분지어주는 거같음

 

아니!! 근데!!! 아무것도 안나와 

-> 계속 생기고 뭐지

세미콜론으로 끝내려는데도 안됨

뭘까..?

 

 

 

 

 

아하!

 

MySQL 콘솔창은 쌍반점(;)이 입력되면 어떤 경우에서건 일단 쌍반점(;) 이전 단계까지 명령문을 실행하게 됩니다.

구분 문자(;) 변경하기

명령분이 완성되지 않은 상태에서 실행되면 곤란합니다. 저장 프로시저에서 END를 입력하고 나서 CREATE PROCEDURE 명령이 실행되도록 환경을 변경해야 합니다.

 

그러려면 저장 프로시저를 작성하기 전에 구분 문자를 쌍반점(;)이 아닌 다른 문자로 변경해 둡니다. 일반적으로는 //을 사용합니다.

 

구분 문자를 //으로 변경할 때에는 DELIMITER 명령을 사용합니다.


맨 마지막의 DELIMITER ;는 구분 문자를 원래대로 되돌려 놓는 명령입니다. 구분 문자를 쌍반점(;)으로 되돌려 놓는 것을 잊지 않도록 합니다.

출처: https://recoveryman.tistory.com/186 [회복맨 블로그]  회복맨, 당신은 최고의 정리맨이자 설명맨입니다. 짱짱~


 

DELIMITER 가 구본문자를 바꾸는 명령어구나

구본문자를 세미콜론에서 //이걸로 바꿔놓고 

안된다고 하고 있었구나....ㅋㅋㅋㅋㅋㅋ

 

 

 

DELIMITER //
create procedure pro()
begin 
select name from sequence;
select deposit_date from sequence;
end
//




DELIMITER ;

call pro;

 

 

삭제하고 다시 만들어봐야지

 drop procedure if exists 프로시저 이름;

 

 

임의로 값 넣어놓음

 

DELIMITER //

구본문자//로 바꾸고

create procedure pro(d int)

프로시저 pro만들고 int형 인수d들어가게끔 사용할거임
begin 

시작
select * from sequence where interest_amount < d;

다가져와 seuquence 테이블에서 interest_amount가 d보다 작은 것중에서
end


//

프로시저 끝


DELIMITER ;

구본문자 다시 ;로 바꿈

call pro(3);

프로시저 실행. 인수에 3넣고 (3보다 작은 interest_amount 가져올거임)

 

 

 

 

이제 다시 while문 해봐야지..

 

https://recoveryman.tistory.com/186

 

[MySQL & PHP] 12장 저장 프로시저 활용하기

정리 1. 저장 프로시저의 의미와 작성 방법 1. 저장 프로시저란? 1.1 이용할 수 있는 버전 저장 프로시저를 학습하기 전에 MySQL의 버전을 확인하도록 합니다. 저장 프로시저는 MySQL 버전 5.0 이상에

recoveryman.tistory.com

 

이글은 보고 또 봐야지.. 뒤에는 다 안해봄!

 

 

 

 

728x90
728x90

https://stepby-yun.tistory.com/185

 

mysql 이자액 계산기 식 만들기 (값 띄우기select,넣기insert,삭제TRUNCATE)

목표 년 이자 4프로를 12개월로 나눠서 매월 찍히는걸로 하는건데 이름은 그대로 입금날짜는 한달씩 증가로 찍혀야함!! 이자율 계산 INSERT INTO test.sequence (interest_amount) SELECT (deposit_amount ..

stepby-yun.tistory.com

 

지난시간..

복잡한 식을 깔끔하게 만들어주고자 변수를 사용해봤다.

 

 

(찾아보니까 declare(타입선언)랑 set(변수할당)있었는데 어째서인제 declare은 자꾸 빨간선뜸.

변수 설정할때 @이름 으로 씀)

 

use test;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤',now(),'10000000');

set @lastDate = (select deposit_date from sequence order by id desc limit 1) ;
set @initial_amount = (select deposit_amount from sequence where id='1');
set @name = (select name from sequence where id='1');


INSERT INTO sequence (name,deposit_date,interest_amount)
select @name,
 (select date_add(@lastDate,INTERVAL 1 MONTH)),
@initial_amount* 0.04 /12;

 

 

 

하.지.만.

 

 

마지막 행 날짜값에다가 한달씩 더해야되는데 

자꾸 첫번째 행값에 더했다.

 

 

 

 

 

예상했던대로 변수 재할당 다시 해야만 

마지막 값을 가져왔다. 허허...

 

어떻게 해결할 것인가~ 

 

 

 

만약에 행이 추가되면 변수 재할당으로 해야하나????

???

 

 

 

 

728x90
728x90

 

목표

년 이자 4프로를 12개월로 나눠서

매월 찍히는걸로 하는건데

이름은 그대로 입금날짜는 한달씩 증가로 찍혀야함!!

 

<1차시도>

이자율 계산

 

 

INSERT INTO test.sequence (interest_amount) SELECT (deposit_amount * 0.04 /12)  from test.sequence;

 

 

 

이거 참고함 https://velog.io/@gillog/MySQL-SELECT%EB%90%9C-%EA%B2%B0%EA%B3%BC%EB%A1%9C-INSERT-%ED%95%98%EA%B8%B0

 

 

<2차시도>

한달씩 증가한 날짜 찍기

 

날짜 

https://allmana.tistory.com/7

 

[MySQL] 날짜 더하기 빼기 date_add

[MySQL] 날짜 더하기 빼기 date_add MySQL에서는 날짜를 더하고 뺄때 쓰는 함수가 있다. 바로 date_add 사용법 DATE_ADD(date, INTERVAL 계산수 계산형식) 계산형식이란 월,일,시간 중 어떤걸 더할꺼냐를 선택하

allmana.tistory.com

현재를 기준으로 1달씩 더함

select date_add(now(),INTERVAL 1 MONTH) ;

 

지금을 기준으로 식만들면 다시 재사용하기 힘듦..

 

INSERT INTO test.sequence (deposit_date) select date_add(now(),INTERVAL 1 MONTH);

 

 

 

테이블 내용 삭제하고 다시~

 

TRUNCATE

  • 테이블의 전체 데이터를 삭제
  • 테이블에 외부키(foreign key)가 없다면 DELETE보다 훨씬 빠르게 삭제됨
# 문법
TRUNCATE 테이블명

# 예제
TRUNCATE student;

https://wayhome25.github.io/mysql/2017/03/20/mysql-05-table-insert-delete-modify/

 

MySQL 05. MySQL - Table (insert, update, delete) · 초보몽키의 개발공부로그

 

wayhome25.github.io

<3차시도>

 

위에 한거 동시에 적용해보기

 

 

sequence테이블에 날짜항목, 이자액항목에   지금에 한달추가한 날짜값,  계산한 이자금액 넣는다.

 

INSERT INTO sequence (deposit_date,interest_amountselect date_add(now(),INTERVAL 1 MONTH),10000000* 0.04 /12;

 

 

 

 

숫자로 넣어서 하긴했는데 실제는 이렇게 하면 안될듯 

재사용할 수 있게 변수지정해야되지 않을까

 

 

 

 

 

<4차시도>

 

 

 

 

 

 

INSERT INTO sequence (deposit_date,interest_amount) select date_add((select deposit_date from sequence where id='1'),INTERVAL 1 MONTH),(select deposit_amount from sequence where id='1')* 0.04 /12;

 

 

where id="1"

로 첫번째 행에 있는 값을 사용하게 했다. 금액은 괜찮은데

하지만 날짜는 이전행을 기준으로 한달씩 증가되어야한다.

 

<5차시도>

 

LAG함수쓰면 될거같은데 안되네....

아 된건가?

SELECT * FROM test.sequence;
use test;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');
INSERT INTO sequence (deposit_date,interest_amount) select date_add(now(),INTERVAL 1 MONTH),10000000* 0.04 /12;
 select deposit_date, LAG(deposit_date) over(order by deposit_date) from sequence;

 

<6차시도>

흠...

select deposit_date from sequence order by id desc limit 1;

마지막행선택함.

이렇게  마지막 행의 날짜를 선택하고 거기에 한달씩 더해주면 되지 않을까?

 


select date_add(deposit_date,INTERVAL 1 MONTH) from sequence where  deposit_date order by id desc limit 1;

오 됐다

한달 추가하겠다 마지막행으로 찾은 날짜에

 

 

 

 

 

ㅇㄴㄹㄴ

 

오됐다

 

 

INSERT INTO sequence (deposit_date,interest_amountselect date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 MONTH),(select deposit_amount from sequence where id='1')* 0.04 /12;

 

 

 

 

<종합해보면>

 

SELECT * FROM test.sequence;
use test;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');

 

INSERT INTO sequence (deposit_date,interest_amount) select date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 MONTH),(select deposit_amount from sequence where id='1')* 0.04 /12;

 

<7차시도>

아 이름도 같이 들어가게끔

INSERT INTO sequence (name, deposit_date,interest_amount) 
select (select name from sequence order by id desc limit 1) ,date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 MONTH),
(select deposit_amount from sequence where id='1')* 0.04 /12 ;

 

 

<결과>

 

 

use test;
insert into sequence (name,deposit_date,deposit_amount) values ('이소윤','20200509','10000000');
INSERT INTO sequence (name, deposit_date,interest_amount) 
select (select name from sequence order by id desc limit 1) ,date_add((select deposit_date from sequence where  deposit_date order by id desc limit 1),INTERVAL 1 MONTH),
(select deposit_amount from sequence where id='1')* 0.04 /12 ;

근데 식이 너무 더러운데..

다시 정리해보자~

728x90
728x90

https://stepby-yun.tistory.com/181

 

지난시간,,,

 

 

 

 

바디파서 해봐도 (express로 사용) 안되고 무한히 헤매었다

한번에 저장안하고 따로 할까 싶어서 마이페이지 만들어서 뺐다가 

생각해보니 해당 id에 프로필을 저장하는거라서 더 복잡해지겠다 싶었다(프로필 수정도 만들 때 그거 해야겠지만..)

어쨌든 같은 데이터 행에 넣어줘야하니까.

 

 

방법은 여러가지 있겠지만 내가 찾은 거는 

formdata.append로 아이디랑 유저도 저장하는 방법이었다.

(method) FormData.append(name: string, value: string | Blob, fileName?: string): void

append(키, 값) 

이란 거는 알았는데 multer쓰면서 

upload.single(키) 값과 같아야된대서 

 

이미지 아닌 아이디와 비번은 좀 다른 줄 알았다. (multer사용한 이미지는 req.body로 가져오는 것도 아니어서 좀 실제로 다르기도 함)

 

해당하는 키값을 

req.body.키값

으로 찍어보니 나왔다. 

 

req.body가 잘나오는게 append로 넣어줘서 그런건가..?

(바디파서 빼봐도 잘나옴)

 

 

req만 콘솔로 찍어보니 엄청 길게 나오는데 그중에 body랑 file이 보이네

 

 

 

 

 

 

으어 한번에 user정보랑 이미지경로 저장성공

 

react 프론트 코드

import React, { useState } from "react";
import Axios from "axios";
import "./signup.css";

function Signup() {
  //회원가입 값
  const [id, setId] = useState("");
  const [password, setPassword] = useState("");

  // const [imageUpload, setImageUpload] = useState(null);

  const [image, setImage] = useState({
    preview:
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAM1BMVEXk5ueutLfn6eqrsbTp6+zg4uOwtrnJzc/j5earsbW0uby4vcDQ09XGyszU19jd3+G/xMamCvwDAAAFLklEQVR4nO2d2bLbIAxAbYE3sDH//7WFbPfexG4MiCAcnWmnrzkjIRaD2jQMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMw5wQkHJczewxZh2lhNK/CBOQo1n0JIT74/H/qMV0Z7GU3aCcVPuEE1XDCtVLAhgtpme7H0s1N1U7QjO0L8F7llzGeh1hEG/8Lo7TUmmuSrOfns9xnGXpXxsONPpA/B6OqqstjC6Ax/0ujkNdYQQbKNi2k64qiiEZ+ohi35X+2YcZw/WujmslYewiAliVYrxgJYrdwUmwXsU+RdApUi83oNIE27YvrfB/ZPg8+BJETXnqh9CVzBbTQHgojgiCvtqU9thFJg/CKz3VIMKMEkIXxIWqIpIg2SkjYj+xC816mrJae2aiWGykxRNsW0UwiJghJDljYI5CD8GRiCtIsJxizYUPQ2pzItZy5pcisTRdk/a9m4amtNNfBuQkdVhSaYqfpNTSFGfb9GRIakrE2Pm+GFLaCQPqiu0OpWP+HMPQQcgQMiQprWXNmsVwIjQjYi/ZrhAqNTCgr2gu0Jnz85RSSjso0HkMFZ0YZjKkc26a/jlmh9JiDyDxi9oeorTYAzZkwwoMz19pzj9bnH/GP/+qbchjSGflneWYhtTuKdMOmNKZcJ5TjInQKcYXnESd/jQxy0ENpULTNGOGgxpap/oyw9pbUAqhfx2Dbkhovvfgz4iUzoM9+GlK6/Mh4q29hyC1mwro30hpVVLPF9wYQr71RazOeM5/cw81iBRD+A03aM9/C/obbrKjbYSpCmIVG3qT/Q8oeUo3Rz0IL7vI1tEbCB9pSiu8I/aV8x3Kg/BGWrWp4ZVs0nZfmAoEG4h/61yHYIJiFSl6Q0Vk6tTW1N8kYp8hdOkfHYYMXd2Qft+8CYwqYDSKvqIh+MCF8Wgca2u/cwdgeW3TtuVn6+1oBs3yLo5C2JpK6CvQzGpfUkz9UG/87gCsi5o2LIXolxN0FbwAsjOLEr+YJmXn7iR6N0BCt5p5cMxm7eAsfS+/CACQf4CTpKjzgkvr2cVarVTf96372yut7XLJ1sa7lv6VcfgYrWaxqr3Wlo1S6pvStr22sxOtTNPLzdY3nj20bPP+ejFdJYkLsjGLdtPBEbe/mr2bQKiXWJDroA+vtzc0p9aahuwqHMDYrQEXHEw9jwQl3drMpts9JBU1SdktPe5FBRdJQ6bwXBpa57ib2A8kukQDzMjh++Uo7Fo6Wd02Pkf4fknqoo4HtvAIjsqUcjx6DIPgWCaOML9rKI/oqD9/lgNrn+eF+p7j8tnzHBiR7+kdUGw/+V1Kzkc75mMy6U+FMaxjPibiM1U1uGM+puInHpmALZCgP4pt7i840MV8+0R1zPsRB6UTcqpizncYwZ89syDydfyWCwXB1l8/zRNGWbTG/GHKUm9AkxHMc/EGSk3z2+ArEhPEV5TUBLEvUGFcjEUH80J/jveTGOAJEljJbILWGQT3zRYiwuKsUXN1EEJAzBhRJFll7mBUG7KD8EqPkKekBREaL8hMDZLQSG6AQjtHPYmvTQnX0TtpC1SYCe2YdkkyLP3jj5BSbKiuR585eQhTgoje6yIb0Yb0C+mV6EYvebqw5SDy2WmubogZiF2AVxPC2FpDf8H2Q9QWo6IkjUxTWVEI3WY/wrCeSuqJ+eRWzXR/JXwgVjUMozbCOfoEZiSiKVGepqv5CJ8RyR4D7xBeamqa7z3BJ/z17JxuBPdv93d/a2Ki878MMAzDMAzDMAzDMAzDMF/KP09VUmxBAiI3AAAAAElFTkSuQmCC",
    data: "",
    // Headers: " 'Content-Type': 'multipart/form-data'",
  });

  //다 userlist에 담아서 db저장하기
  // const [userList, setUserList] = useState([]);

  const onChangeId = (event) => {
    setId(event.target.value);
  };

  const onChagePassword = (event) => {
    setPassword(event.target.value);
  };

  const Submit = (e) => {
    e.preventDefault();

    let formData = new FormData();
    formData.append("file", image.data);

    formData.append("iddd", id);
    formData.append("password", password);

    console.log(image.data, "선택한이미지! ");
    console.log(formData, "들어가기전폼데이터");

    Axios.post(
      "http://localhost:3001/submit",

      // {
      //   id: id,
      //   password: password,
      // },

      formData,

      {
        headers: {
          "Content-Type": "multipart/form-data",
        },
      }
    ).then(() =>
      console.log(
        formData,
        "then이후 폼데이터",
        image,
        "이건뭐",
        image.data,
        "이미지데이터"
      )
    );
  };

  const handleFileChange = (e) => {
    const img = {
      preview: URL.createObjectURL(e.target.files[0]),
      data: e.target.files[0],
    };

    setImage(img);
  };

  return (
    <div className="formBox">
      <div className="signup_id">
        <input placeholder="아이디" onChange={onChangeId}></input>
      </div>
      <div className="signup_password">
        <input placeholder="비밀번호" onChange={onChagePassword}></input>
      </div>
      <div>
        <input placeholder="비밀번호 확인"></input>
      </div>
      {image.preview && <img src={image.preview} width="100" height="100" />}
      <input
        type="file"
        onChange={handleFileChange}
        name="Images"
        accept="Images/*"
      />

      <button onClick={Submit}>제출</button>
    </div>
  );
}

export default Signup;

 

백 코드

 

const express = require("express");
const app = express();

const mysql = require("mysql");
const cors = require("cors");
const multer = require("multer");
const path = require("path");
app.use(cors());

//이거 필요한거임?
// app.use(express.static("Images"));

const db = mysql.createConnection({
  user: "*",
  host: "*",
  password: "*",
  database: "*",
});

///////

const upload = multer({
  storage: multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, "Images/");
    },
    filename: function (req, file, cb) {
      cb(null, new Date().valueOf() + path.extname(file.originalname));
    },
  }),
});

app.post("/submit", upload.single("file"), (req, res) => {
  // console.log(req.body.posts, "레큐바디");
  console.log(JSON.stringify(req.body), "JSON.stringify(req.body)");
  console.log(req.body, "바디");

  const profile = req.file.path;
  const id = req.body.iddd;
  const password = req.body.password;

  console.log(id, password, "아이디랑 패스워드");

  console.log(req.file, "파일");
  console.log(profile, "프로파일");

  console.log(profile, "프로필 들어갈 정보");

  db.query(
    "INSERT INTO userlist (userId,userPassword,userProfile) VALUES (?,?,?) ",
    [id, password, profile],

    (err, result) => {
      if (err) {
        console.log(err, "실패ㅠㅠㅠ");
      } else {
        res.send("userlist values inserted");
        // console.log("성공~");
      }
    }
  );
});

app.listen(3001, () => {
  console.log("your server is running on 3001~! yeah");
});

 

 

 

이제 

유효성검사

비밀번호 암호화 해봐야지..

 

아 그전에 데이터 삭제부터하자

 

 

 

 

https://limdef.tistory.com/m/7

728x90
728x90

지난 시간,,,

https://stepby-yun.tistory.com/179

 

formData 이미지데이터 보내고 받기 (react,nodejs,header)

회원가입시 아이디 비번 프로필을 등록하려했다. id password는 넘겨주고 req.body.id로 받았는데 프로필은 formData 객체로 묶어서 그자체로 넘겨줬는데 자꾸 undefined 떴다. formData는 req.body가 안된다길

stepby-yun.tistory.com

formData 로 이미지 받는 걸 Header를 뒤늦게 추가해서 넣었다.

이제 mySQL 데이터베이스에 넣으려는데

아무것도 없고  BLOB만 달랑 저장됨

이미지 저장은 보통 BLOB로 한다고 해서 타입을 이렇게 넣었는데 

저렇게만 보이니 당황,, 

 

 

BLOB은 뭘까?

A Binary Large Object (BLOB) is a MySQL data type that can store binary data such as images, multimedia, and PDF files.

바이너리 데이터를 DB외부에 저장하기 위한 타입이다

"blob의 경우 4GB의 이진 데이터를 저장할 수 있다고 합니다. 하지만 이건 DB에 직접 저장하는 것이 아니라 DB에는 Large Object의 위치 포인터만 저장하게 됩니다."

그말은 즉, 컴퓨터가 인식하는 모든 파일(이진 데이터)를 저장하는 타입이라고 한다. 오 찾아보니까 볼 수 있긴하네

이렇게 확인할 수는 있구만 

 

 

하지만 BLOB보다는 URL자체로 저장을 선호한다고 한다.

그 이유는데이터베이스 서버는 애플리케이션이 확장될 때 종종 성능병목 현상이 일어나는데 이미지와 함께 로드하면 더 큰 병목현상이 발생한다고 함.

Many web app designers don't store images in database BLOBS, but rather store them in a file system, and store their URLs in database strings. Why? Database servers often become a performance bottleneck when an application scales up. If you load them with images, they'll become even bigger bottlenecks.

 

그럼 string문자열로 바꿔줘야지~

하고 string찾는데 없어 아 맞다 VAR이지하고 보다가

 

VARCHAR과 CHAR의 차이가 뭔가 궁금해졌다

VARCHAR은 '가변길이'

실질적인 데이터와 길이 정보도 같이 저장된다.

CHAR은 길이가 고정되어있어야한다. 남는 공간은 공백으로 채운다 공간낭비 발생!

VARCHAR is variable length, while CHAR is fixed length

https://petri.com/sql-server-string-data-types/

 

 

 

경로저장함

 

 

 

이제 id랑 password 도 함께 저장해봐야지 

 

 

 

 

 

 

출처

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=magnking&logNo=220950061851

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rlasksdud53&logNo=220595010315

 

 

728x90
728x90

따라하면서

순서, 필요한 내용 적기 

<이 순간, 최고의 강의_별점 백개 드립니다_>

https://www.youtube.com/watch?v=re3OIOr9dJI 

 

client -react 프론트

server -express, 백단

 

client/ npx create-react-app .

(.은 현재 위치를 의미함)

server/ npm init 

해서 package.json 생성하고

필요한 

mysql express 

설치

 

client/

Login.js

import { useState } from "react";
import "./login.css";

function Login() {
  const [name, setName] = useState("");
  const [age, setAge] = useState(0);
  const [country, setCountry] = useState("");
  const [position, setPosition] = useState("");
  const [wage, setWage] = useState(0);

  const onChangefun = (event) => {
    setName(event.target.value);
    console.log(event.target.value);
  };
  return (
    <div className="login">
      <div className="information">
        <label>Name : </label>
        <input type="text" onChange={onChangefun}></input>
        <label>Age : </label>
        <input
          type="number"
          onChange={(event) => {
            setAge(event.target.value);
          }}
        ></input>
        <label>Country : </label>
        <input
          type="text"
          onChange={(event) => {
            setCountry(event.target.value);
          }}
        ></input>
        <label>Position : </label>
        <input
          type="text"
          onChange={(event) => {
            setPosition(event.target.value);
          }}
        ></input>
        <label>Wage: </label>
        <input
          type="number"
          onChange={(event) => {
            setWage(event.target.value);
          }}
        ></input>
        <button>직원 등록</button>
      </div>
    </div>
  );
}

export default Login;

 

server/

index.js

const express = require("express");
const app = express();

app.listen(3001, () => {
  console.log("your server is running on 3001~! yeah");
});

 

이제 mysql 설정해줄거임

 

mysql 워크벤치에서 

스키마 생성

테이블 생성

server/

디비저장 코드 입력

 

const express = require("express");
const app = express();
const mysql = require("mysql");

const db = mysql.createConnection({
  user: "root",
  host: "localhost",
  password: "비밀번호",
  database: "crudtest",
});

app.post("/create", (req, res) => {
  const name = req.body.frontname;
  const age = req.body.frontage;
  const country = req.body.frontcountry;
  const position = req.body.frontposition;
  const wage = req.body.frontwage;

  db.query(
    "INSERT INTO employees (name, age, country, position, wage) VALUES (?,?,?,?,?)",
    [name, age, country, position, wage],
    //콜백함수
    (err, result) => {
      if (err) {
        console.log(err);
      } else {
        res.send("values Inserted");
      }
    }
  );
});

app.listen(3001, () => {
  console.log("your server is running on 3001~! yeah");
});

client/

import { useState } from "react";
import "./login.css";
import Axios from "axios";

function Login() {
  const [name, setName] = useState("");
  const [age, setAge] = useState(0);
  const [country, setCountry] = useState("");
  const [position, setPosition] = useState("");
  const [wage, setWage] = useState(0);

  const addEmployee = () => {
    Axios.post("http://localhost:3001/create", {
      frontname: name,
      frontage: age,
      frontcountry: country,
      frontposition: position,
      frontwage: wage,
    }).then(() => {
      console.log("success");
    });
  };

  const onChangefun = (event) => {
    setName(event.target.value);
    console.log(event.target.value);
  };
  return (
    <div className="login">
      <div className="information">
        <label>Name : </label>
        <input type="text" onChange={onChangefun}></input>
        <label>Age : </label>
        <input
          type="number"
          onChange={(event) => {
            setAge(event.target.value);
          }}
        ></input>
        <label>Country : </label>
        <input
          type="text"
          onChange={(event) => {
            setCountry(event.target.value);
          }}
        ></input>
        <label>Position : </label>
        <input
          type="text"
          onChange={(event) => {
            setPosition(event.target.value);
          }}
        ></input>
        <label>Wage: </label>
        <input
          type="number"
          onChange={(event) => {
            setWage(event.target.value);
          }}
        ></input>
        <button onClick={addEmployee}>직원 등록</button>
      </div>
    </div>
  );
}

export default Login;

프런트에서 백 전달할때 

우리는 api허용해주기 위해서 cors 라이브러리 사용할거임

npm i cors

 

server/ index.js 파일에

const cors = require("cors");
app.use(cors());

추가

 

 

 

 

근데 여전히 막상보면 백으로 못넘어옴

이렇게 req.body 콘솔 찍어보면 

undefined 뜸 

 

json 미들웨어를 제공안해서였음

프런트에서 보낼때 

 

 

index.js/

app.use(express.json());

이거 추가

 

유튜브영상에서는 이거 추가하면 db넣기 성공했는데 난 안됨. ㅎ

 

 db에 안들어가고 

에러 뜸

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

 

 

이거 mysql에 외부접근안돼서 그런거라고 함  

그래서 이걸로 해결가능하다고 함( 비번 사용해서 db계정사용하게끔 하는 설정인듯!)

 

+해결방법중에 mysql2쓰는 것도 있음 이번에는 안해봄 

 ALTER user '[유저]'@'localhost' IDENTIFIED WITH mysql_native_password by '[비번]';

 바꿔주기 위해서 mysql로 ㄱㄱ

mysql에 바로 use mysql하면 접속이 안됨

mysql -u root -p도 당연히 안됨

 

 

'use'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다

워크벤치 경로로 들어가서 해야함~~~

C:\Program Files\MySQL\MySQL Server 8.0\bin

 

 

cd C:\Program Files\MySQL\MySQL Server 8.0\bin

mysql -u root -p

 

이제 mysql켜짐

 

mysql>

 

 

계정 뭐있는지 확인 먼저 함

 

SELECT user,authentication_string,plugin,host FROM mysql.user;

 

내가 쓸 root계정 있는거 확인함

 

 

 

 

 ALTER user '[유저]'@'localhost' IDENTIFIED WITH mysql_native_password by '[비번]';

 

flush privileges;

 

 

 

index.js 

서버 끄고 다시 실행

node index.js

로 실행

 

 

직원등록 눌러서 보내보면 

 

잘 들어왔다~!~!~!~!~!

 

 

 

이제 우리가 할거는

백-> 프런트로 

정보 가져오는걸 할거임

우리는 필요할 때 정보를 봐야하니까 

 

 

client/

//초기에는 빈배열이니까 []로 넣어줌 
 const [employeesList, setEmployeesList] = useState([]);
 //가져올 함수// 백가져온 응답반은걸 콘솔로 보여주겠음 response가져온거의 data로
   const getEmployee = () => {
    Axios.get("http://localhost:3001/employees").then((response) => {
      setEmployeesList(response.data);
    });
  };
  
  
 //버튼
   <div className="showDB">
      //버튼눌렀을 때 가져올 함수 실행
        <button className="showDB-button" onClick={getEmployee}>
          show employees
        </button>
      </div>

 

server/

app.get("/employees", (req, res) => {
//db에서 employess테이블 다 가져와
  db.query("SELECT * FROM employees", (err, result) => {
    if (err) {
      console.log(err);
    } else {
      res.send(result);
    }
  });
});

버튼 누르면

이건 response임 

object 객체로 가져옴

(status 200 -> 작동한거임)

이안에 우리가 원하는 정보가 잘 담겨져있음

 

 

이제 백에서 가져온 것들을 화면에 띄워줄거임

맵함수 사용해서

배열에서 하나씩 꺼내오기 

 

        <div>
          {employeesList.map((val, index) => {
            return (
              <div className="employee">
                <h3>{val.name}</h3>
                <h3>{val.age}</h3>
                <h3>{val.country}</h3>
                <h3>{val.position}</h3>
                <h3>{val.wage}</h3>
              </div>
            );
          })}
        </div>

성공~~~

 

 

근데 다른 방법도 있대 

post에 넣고 바로 화면에 띄우게 하는법

 

const addEmployee = () => {
    console.log(name, "dfdfd");
    Axios.post("http://localhost:3001/create", {
      frontname: name,
      frontage: age,
      frontcountry: country,
      frontposition: position,
      frontwage: wage,
    }).then(
      //   () => {
      //   console.log("success");
      // }
      () => {
        //기존 배열에 방금 입력한 걸 추가하고 그걸 setEmployessList함수에 넣음! 배경은 뜨는데 값이 안띄워지네..흠
        //암튼 여러 방법이 있다고 함 있다가 해보자
        setEmployeesList([
          ...employeesList,
          {
            frontname: name,
            frontage: age,
            frontcountry: country,
            frontposition: position,
            frontwage: wage,
          },
        ]);
      }
    );
  };

나는 왜인지 빈값만 뜸

 

db에는 잘들어갔는데...

왜 안뜨는 것인가...

이부분은 다른 날에 해보겟음

 

 

이제 

삭제 하고 수정하고 다음에 해봐야지

db에서 가져온 목록 선택해서 나열하게 하고

이런 것도 해보고 싶네 

 

아 그리고 지금은 새로고침하면 db에서 블러온 애들이 화면에서 사라지거든

그것도 막아야겠다.

728x90
728x90

https://dukdukz.tistory.com/entry/210604-Sequelize-auto-%EB%A1%9C-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1-%EA%B5%AC%EB%AC%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0

https://www.hanumoka.net/2018/11/23/node-20181123-express-setting-sequelize/

 

Node Express에 sequelize를 이용해 mysql접속하기

들어가기Express 프로젝트에 sequelize(시퀄라이저)를 이용하여 로컬에 있는 mysql에 접속하는 예제를 정리해본다. 미리 로컬에 mysql을 설치하고, 스키마와 계정을 생성 해놨다. 테스트용 Express 프로젝

www.hanumoka.net

MySql에서 워크벤치로 테이블구성을 다 하고 

코드에서 시퀄라이즈 연동을 하려니까 번거로웠다. 뿐만 아니라 타입이 일치한데 해당하는 테이블을 찾을 수 없다고 연결이 안돼서 답답했다. 찾아보니 역시 자동으로 구성된 테이블 코드를 짜주는 방법이 있었다!!

 

나는 EER 에서 다이어그램으로 테이블을 먼저 짰다.

그리고 Forward Enginner를 누르면 

만든 다이어그램이 테이블로 생성이 된다. (Synchronize Model하면 기존에 있는 테이블을 수정하고 업데이트할 수 있다.)

 

 

이제 코드에서 만져보자

 

시퀄라이즈 세팅을 먼저 한다. 

(npm i express

npm i -D nodemon

)

npm i sequelize //시퀄라이즈

npm i mysql2   //mysql과 시퀄라이즈를 이어주는 드라이버이다. 

npm i sequelize-cli   //시퀄라이즈 명령어를 실행하기 위한 패키지다

 

npx sequelize init //하면 기본 폴더가 생성된다.

이제 자동으로 db테이블 코드가져와주는

npm i sequelize-auto

를 깐다. 

 

터미널에 명령어를 입력한다.

npx sequelize-auto -o "./models" -d nodejs -h "localhost" -u "root" -p "3306" -x "비밀번호" -e mysql

 

 

-o "경로"
-d "db 이름"
-h "url"->localhost
-u "root"
-p "port"
-x "password"
-e "mysql"

 

 

그럼 필요한 user, music,artist 코드가 자동으로 생긴다. 

근데 문제는 코드가 좀 다르다 function이다.

 

내가 db구조 짤때 참고한 nodejs책에서는 class로 해서 

안에 내용을 기존에 참고했던 식으로 바꿔줬다. 큰틀만 바꾸면 됨

artist.js

그리고 init-model.js도 생겼는데

나는 index.js로 작업하고 잘모르겠고 구조도 바꿔줘서 

주석처리했다. 

대신 관계정의할 때 필요한 것들은 참고해서 넣었다.

artist.js

수정한다음에 혹시몰라서 

워크벤치에 있는 database를 삭제하고

 

npx sequelize db:create로 다시 db를 만들고

npm start 실행했다. 

 

연결잘된다. 

 

 

(

문제는 내가 원하는건 user랑 artist의 1대1관계인데

분명 user에 hasOne, artist에 belongsTo로 줬는데 

왜 다이어그램을 뽑아보면 1대다로 나오는지 모르겠다....)

 

 

 

 

그리고 일대다에도 종류가 두개있어서 놀람

https://jins-dev.tistory.com/entry/RDBMS%EC%9D%98-%EA%B4%80%EA%B3%84-Identifying-NonIdentifying-Relationship-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

RDBMS의 관계 - Identifying & Non-Identifying Relationship 에 대하여

 RDB에서 관계를 맺는데 있어서 식별관계(Identifying Relationship)와 비식별관계(Non-Identifying Reltationship)가 존재한다. 정확히는 RDBMS에서 나누는 관계가 아닌 ER Diagram 상에서 논리상 나누는 개념이..

jins-dev.tistory.com

 

이건그냥 공식문서 필요할때 보라고 넣어둠

https://sequelize.org/master/manual/legacy.html

 

Manual | Sequelize

Working with Legacy Tables While out of the box Sequelize will seem a bit opinionated it's easy to work legacy tables and forward proof your application by defining (otherwise generated) table and field names. Tables class User extends Model {} User.init({

sequelize.org

 

728x90
728x90

nodejs책 340쪽 필기함

 

공식문서도 좋음

 

 

https://sequelize.org/v4/manual/tutorial/associations.html

 

Tutorial | Sequelize | The node.js ORM for PostgreSQL, MySQL, SQLite and MSSQL

Associations This section describes the various association types in sequelize. When calling a method such as User.hasOne(Project), we say that the User model (the model that the function is being invoked on) is the source and the Project model (the model

sequelize.org

 

728x90
728x90

참고로 나는 이 두 에러가 스벅의 부실한 와이파이 때문이었음.. 

응아니고 mariadb 실행안해서였음요!!  기존에 쓰던 mysql는 초기설정으로 자동실행되게 설정해놓은 거라 마리아디비는 쓸라면 실행해줘야됐음!!!!!! ()

 

ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)   

 

 


+자동실행되는 설정

출처:&nbsp;&nbsp;https://codecoco.tistory.com/category

 


db연결하는 법 

mysql과 같음 이 코드 mysql연결하는거 보고 한거임(시퀄라이즈가 다른 sql데이터베이스들도 호환가능해서)

출처는 책임 | Node.js 교과서 | 조현영 p.315

 

 

 

package.json에 npm start하기 위해 넣기

start 노드몬 앱 넣기

시작할거를 main에 app.js로 

{
  "name": "4th-project-yunminblock",
  "version": "1.0.0",
  "description": "소윤이 보아라",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.2",
    "morgan": "^1.10.0",
    "mysql2": "^2.3.3",
    "nunjucks": "^3.2.3",
    "sequelize": "^6.13.0",
    "sequelize-cli": "^6.3.0",
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}

 

시퀄라이즈에 필요한 모듈패키지설치

npm i express morgan nunjucks sequelize sequelize-cli mysql2

npm i -D nodemon

 

 

설치 완료 후

 

npx sequelize init

 

하면 

config, models, migrations, seeders폴더가 생성됨

models폴더 안에는 index.js가 있음

 

몇개는 지금 블록체인중이라서 넣은거라 안따라해도 됨

index.js 를 이렇게 수정고우

const Sequelize = require("sequelize");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};

//기존
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

db.sequelize = sequelize;

module.exports = db;

 

이제 시퀄라이즈 통해 express앱과 mysql연결할거임

app.js 파일 만들고 안에 코드 넣기

const express = require("express");
const path = require("path");
const morgan = require("morgan");
const nunjucks = require("nunjucks");

const { sequelize } = require("./models");

const app = express();
app.set("port", process.env.PORT || 3307);
app.set("view engine", "html");
nunjucks.configure("views", {
  express: app,
  watch: true,
});

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("데이터베이스 연결성공");
  })
  .catch((err) => {
    console.log(err);
  });

app.use(morgan("dev"));
app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());

app.use(express.urlencoded({ extended: false }));

app.use((req, res, next) => {
  const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== "production" ? err : {};
  res.status(err.status || 500);
  res.render("error");
});

app.listen(app.get("port"), () => {
  console.log(app.get("port"), "번 포트에서 대기중");
});

마리아db포트가 3307로 되어 있어서 이렇게 했는데

사실 상관없는거같긴함 (서버는 계속 헷갈리는데 db서버가 3307포트인건 알겠고 여기서 넣는 포트는 아마 localhost:로 화면에 띄워주는 포트라고 이해함요..네.. )

여기서 3001로 바꿔도 잘됨 config에 port주소가 3307로 잘들어가 있기만 하면 문제없는듯 그거는 마리아db연결용 이건 보여주는포트용으로이해햇음

 

 

이제 중요한거.

config 내용임!!!

 

나는 마리아 디비쓰니까 그 유저네임이랑 그 비번 그 host로 적어줘야 한다

마리아 디비의 port랑

그래서 이렇게 했다

{
  "development": {
    "username": "mariatest",
    "password": "1234",
    "database": "mariadb",
    "host": "localhost",
    "dialect": "mysql",
    "port": "3307"
  },
  "test": {
    "username": "mariatest",
    "password": "1234",
    "database": "database_test",
    "host": "0.0.0.0",
    "dialect": "mysql"
  },
  "production": {
    "username": "mariatest",
    "password": "1234",
    "database": "database_production",
    "host": "0.0.0.0",
    "dialect": "mysql"
  }
}

아마 두세번째 애들은 상관없을듯 혹시나 해서 저렇게 넣어둔거임

 

 

 

이제 npm start하면 끝!!!

 


 

 

사실 위에도 말했지만 나는 연결안된다고 에러떴었음

ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT
    at ConnectionManager.connect

 

암튼 이거 몰라서 mariadb들어가서 확인해보려는데 접근이 안됨

 

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

 

 

sudo service mysql restart

이것도 해보고 계속 안되다가 

+아냐 이게 실행이야 이거 하니까 된거임!!

+

 

 

sudo mysql -u root -p

로 하니까 들어가짐

 

들어가서 문제 있나 확인함

 

흠... config랑 비교해봄 

user mariatest 인지 host localhost로 되어있나..

 

npm start했을 때 db없다길래 

npx sequelize db:create

로 생성하고

실행

npm start

 

 

안에도 잘있군

 

얏호

 

 

 

https://velog.io/@pier101/Linux-wsl-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EB%A7%8C%EB%93%A4%EA%B8%B0nginx

 

[Linux] wsl 환경에서 로그인,회원가입 만들기(+nginx)

wsl 환경에서 node.js+react(+nginx)를 활용해 웹페이지를 만들어 보면서 ubuntu 환경에서 서버를 어떻게 구축하는지에 대한 감을 익히고 서버 구성에 대해 알아볼 것이다.📢본 작업은 wsl상에서 서버를

velog.io

 

 

 

 

 

728x90
728x90

설치 완료 후

 

 

mysql로 접속

 

설치된 폴더 경로로 들어가서 

cd 폴더경로

 

 

들어가서> mysql -u root -p

 

비번 입력하면 뜸!

 

나가고 싶으면

exit

 

데이터베이스 생성

create database movie_db default character set utf8;

 

영화정보 넣을거라서  movie_db로 넣었음

 

create database movie_db default character set utf8;

(MySQL이 기본적으로 알고 있는 구문을 예약어라고 부름 예약어는 소문자로 써도 되지만 대문자로 쓰는게 좋아

사용자가 직접만든 이름이랑 구분하기 위해서)

 

 

이거 사용할거야~

mysql> USE movie_db;

 

 

이전에 만든

데이트베이스 리스트 보고 싶으면

mysql> show databases;

 

그중에서 사용할 꺼 USE 데이터베이스

하고 

테이블 보기

mysql> show tables;

 

 

 

 

 

 



 

 

 

테이블(데이터가 들어갈 수 있는 틀) 생성하는 명령어

 

create table [데이터베이스명. 테이블명] 

 

mysql>  CREATE TABLE products(
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

 

 

아까 USE 테이터베이스명 해서 

생략해도 됨

 

 

만들어진 테이블 확인하는 명령어 

DESC 테이블명

 

 

 

테이블  컬럼 추가

ALTER TABLE `테이블명` ADD `컬럼명` VARCHAR(50) NOT NULL;

 

mysql> ALTER TABLE `products` ADD `name` VARCHAR(50) NOT NULL;

 

악 에러 뜬 이유가 `` 뱁틱이어서 그랬음..ㅎㅎ

 

 

이렇게 괄호로 묶어서 한번에 여러 개 넣어줄 수도 있음

 

 

 

 

개념 정리하고 가자~~~

 

(아직 데이터를 안넣어서 책에 나온 예시로 정리)

 

컬럼과 로우

id  name  age married
1 zero 24 false
2 nero 32 true
3 hero 28 false

 

컬럼(column) : id, name, age,married 과 같은 세로줄 

(age 컬럼에는 24,32,28과 같은 정보 담겨있음)

로우(row) : 1,zero,24,false와 같은 가로줄. 

 

필드 : 컬럼과 로우가 교차하는 칸 하나

컬럼은 세로필드의 집합

로우는 가로 필드의 집합

테이블에 데이터를 넣을 때는 미리 컬럼을 정의해두고 컬럼에 맞춰 데이터를 넣으면 된다.

 

컬럼의 자료형

  • INT : 정수 의미. 소수까지 저장하고 싶다면 FLOAT 나 DOUBLE 자료형 사용
  • VARCHAR(자릿수) : 가변길이. 0~자릿수인 문자열 넣을 수 있음
  • CHAR(자릿수) : 고정길이 자료형. 부족한 자릿수만큼 스페이스가 채워짐
  • TEXT : 긴 글 저장할 때 사용. 수백 자 이내의 문자열은 보통 VARCHAR(자릿수)사용하고 그보다 길면 TEXT 사용
  • TINYINT : -128부터 127까지의 정수 저장할 때 사용. 1또는 0만 저장하면 불값(Boolean)과 같은 역할 할 수 있음
  • DATETIME : 날짜와 시간에 대한 정보 담고 있음. 날짜 정보만 담는 DATE / 시간정보 담는 TIME 자료형

 

(자료형 뒤) 옵션

  • NULL 과  NOT NULL  : 빈칸 허용할지 여부 묻는 옵션
  • AUTO_INCREMENT : 숫자를 저절로 올리겠다는 뜻 (데이터 넣으면 알아서 id로 1번부여, 다음 2번 부여 이렇게)
  • UNSIGNED : 숫자 자료형에 적용되는 옵션. 음수 무시되고 0~4294967295까지 저장가능.나이 컬럼에 체크해두는게 좋음
  • ZEROFILL : 숫자의 자릿수가 고정되어 있을 때 사용할 수 있음(예) INT(4)인데 숫자1넣으면 0001이 되는 식)
  • created_at 에는 DEFAULT now()라는 옵션 붙어있음. 현재 시각 넣으라는 뜻. now()대신 CURRENT_TIMESTAMP를 적어도 같은 뜻이 됨. 사용자 정보를 넣으면 created_at 컬럼에는 넣는 순간의 시각이 자동으로 기록됨.
  • 해당 컬럼이 기본 키인 경우에 PRIMARY KEY옵션을 설정. 기본 키란 로우를 대표하는 고유한 값을 의미

 

DEFAULT CHARACTER SET 을 utf8로 설정하지 않으면 한글이 입력되지 않으니 반드시 설정해야 함

 

 

 

테이블 잘못 만들었을 경우 제거하는 법

DROP TABLE [테이블명] ;

 

데이터 입력

INSERT INTO 테이블명 (필드,필드) VALUE ('테이터','데이터'..)

 

선택

Select * from products

전체 선택

 

select 필드, 필드 from 테이블 where 조건

(조건검사 : where 데이터 베이스 안에서 원하는 데이터를 조건에 맞게)

 

 

 

 

 

 

 

 

기본적인 mySQL 관계(비교)연산자 : 주어진 좌우 값을 비교하는 연산자
좌변과 우변이 같다
!= 또는 <>     좌변과 우변이 다르다
<   작다
<=   작거나 같다
크다
>= 크거나 같다

 

 

 

예시

 

 

논리연산자 : 참(true), 거짓(false) 두 가지를 가지고 비교하는 연산자
AND , && 비교하는 값 모두 참(true)여야 결과가 참(true)
OR , ||  비교하는 값 중 하나라도 참(true)이면 결과가 (true) 

예시

 

 

만약 글자에서 특정 부분 일치하는 데이터를 조회하고 싶다면!

LIKE

%는 다른 경우 들어갈 자리에 붙여줌

 

 

정렬하기 

order by

전체 선택해서 

openDate 기준으로 오름차순

 

오름차순 asc (안적어도 자동이긴 함)

내림차순 desc

 

 

특정 위치에 있는 데이터를 선택

LIMIT

상위부터 2까지

 

 

 

 

 

데이터를 3개를 건너뛴 다음에 데이터 1개

 

 

명령어 순서 지켜야함!

 

 

데이터를 수정할 때

update라는 명령어 써주면 됨

여러개 수정할 때

콤마, 사용

 

 

데이터 삭제

테이블 삭제 

DROP TABLE 테이블명;

데이터베이스 삭제

DROP TABLE 데이터베이스 이름;

728x90

+ Recent posts