본문 바로가기
Backend

06월 25일 수 | SW활용 08 - MySQL과 DB연습Ⅱ

by 구라미 2019. 6. 26.

MySQL과 DB연습Ⅱ

MySQL설치하기

1. MySQL 홈페이지에서 MySQL zip 파일을 다운로드한다.

https://dev.mysql.com/downloads/mysql/

- mysql-5.6.44-winx64 버전 설치하였다.

 

2. 압축을 풀고 폴더이름 간단히 설정

 

MySQL 환경설정하기

 

1. MySQL 서버를 실행

1. mysql-5.6/bin 안에 

실행하고, 방화벽 허용하면

 

 

실행된다.

 

※ 나는 이 전에 서브라임텍스트로 c,c++ 컴파일해보려고 설치한게 있어서 잘 실행되었지만

처음 설치하는 사람들은 실행이 안됐다. 

혹시 문제가 생긴다면 vcredist_x64.exe를 다운로드한 다음 설치

만약 설치했는데도 계속 문제가 생긴다면 제어판에서 기존 Visual c++파일을 전부 삭제한 후 재부팅해서 다시 설치.

 

 

2. root의 비밀번호를 만들어준다.

*계정 만들어도됨.

 

> d:

>cd \java0514\mysql-5.6\bin 으로 경로이동

>mysql -u root 슈퍼계정

 

 

3. DB변경하기 

show databases;

이렇게 DB의 목록이 나온다.

 

오라클에서 MySQL로 DB를 바꿔보겠다.

use mysql; 

>show tables;

>select * from user;

알 수 없는 것들이 이렇게 뜬다. 우리가 확인할 것만 추려서 볼 것이다.

 

>select host,user,password from user;

 

4. 계정 비밀번호 설정하기

이제 계정의 비밀번호를 설정해줄 것이다.

 

UPDATE mysql.user SET password=password('1234') WHERE user='root';
FLUSH PRIVILEGES;

 

> update user set authentication_string=password('1234') where user='root';

 

5. 로그인하기

이제 root 계정으로 로그인한다.

 

1) root 계정 / 비밀번호치고 로그인

mysql -u root -p

1234

 

2) java라는 데이터베이스 만들고 보여주기

create database java;

 

show databases;

 

3) java라는 데이터베이스 삭제하고, java0514라는 데이터베이스 만들어서 사용하기

show tables를 했더니 아직 비어있어서 Empty 라고 뜬다.

 

 

6. 테이블 생성하기

 

1) 테이블 만들기

CREATE TABLE SUNGJUK(
SNO INT NOT NULL
,UNAME VARCHAR(20) NOT NULL
,KOR INT NOT NULL
,ENG INT NOT NULL
,MAT INT NOT NULL
,AVG INT
,ADDR VARCHAR(10)
,WDATE DATETIME  -- MySQL에서는 DATETIME 써준다.
);

2)테이블 지우기

테이블은 DROP TABLE SUNGJUK; 로 지운다.

 

3)SNO에 일련번호 부여하기 (Oracle의 시퀀스)

CREATE TABLE SUNGJUK(
SNO INT NOT NULL AUTO_INCREMENT PRIMARY KEY --자동번호부여, 기본키 지정
,UNAME VARCHAR(20) NOT NULL
,KOR INT NOT NULL
,ENG INT NOT NULL
,MAT INT NOT NULL
,AVG INT
,ADDR VARCHAR(10)
,WDATE DATETIME
);

 

7. 테이블에 데이터 삽입하기

 

1) INSERT로 삽입하기

INSERT INTO SUNGJUK(UNAME,KOR,ENG,MAT,ADDR,WDATE)
VALUES('김민교',95,80,76,'NEW YORK',NOW()); --NOW() 현재 시간 불러오기

 

이렇게만하면 한글이 깨진다.

 

 

8. 엔진으로 한글 안깨지게 설정하기

 

1) INSER1. 테이블 ENGINE 설정
- MYSQL 에서는 Table 마다 다른 ENGINE 을 사용 할 수 있다.

  MyISAM : 읽기 위주 요청에 높은 성능
           테이블 단위로 locking (트랜잭션 안됨)

  InnoDB : 트랜잭션 지원
           빈번한 수정, 삭제시 처리 능력 뛰어남
           디스크, 전원 등의 장애 시 복구 성능이 좋음
           동시 처리가 많은 환경에 적합함
           ROW 단위 locking

  MEMORY :  Hash 인덱스 사용 하여 빠름 (테이블 스키마는 남음)
            전원 off 시 데이터 삭제 됨

 
 예) 테이블 생성 시
     CREATE TABLE memory_test(test_idx int, test_name char(5)) ENGINE=MEMORY;
     CREATE TABLE innodb_test(test_idx int, test_name char(5)) ENGINE=InnoDB;
     CREATE TABLE myisam_test(test_idx int, test_name char(5)) ENGINE=MyISAM;

 


2. 문자셋 지정

 

예시)
   CREATE TABLE memo( 
     memono  INT, 
     title   VARCHAR(50), 
     content VARCHAR(200) 
   ) ENGINE=MyISAM DEFAULT CHARSET="euckr"; 

 

 

create table sungjuk (
  sno   int not null auto_increment primary key,
  uname varchar(20) not null,
  kor   tinyint     not null,
  eng   tinyint     not null,
  mat   tinyint     not null,
  tot   int         null default 0,
  aver  int         null default 0,

  addr varchar(10),
  regdt datetime    not null
)ENGINE=MyISAM DEFAULT CHARSET="euckr";

 

CREATE TABLE SUNGJUK( 
SNO INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,UNAME VARCHAR(20) NOT NULL 
,KOR TINYINT NOT NULL 
,ENG TINYINT NOT NULL 
,MAT TINYINT NOT NULL

,TOT INT

,AVG INT
,ADDR VARCHAR(10) 
,WDATE DATETIME NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET="euckr";

이제 한글이름이 깨지지 않고 출력된다.

 

 

 

 


 

DB연습 Ⅱ

 

연습문제 1) 행추가,수정하기

추가

이름: 손흥민, 국어: 95, 영어:80, 수학:75, 주소:UK

INSERT INTO SUNGJUK(SNO,UNAME,KOR,ENG,MAT,ADDR,WDATE) 
VALUES(SUNGJUK_SEQ.NEXTVAL 
,'손흥민' 
,95,80,75,'UK',SYSDATE); 

 

수정

영문주소 'Seoul'을 '서울'로 변경하시오.

UPDATE SUNGJUK SET ADDR='서울' WHERE ADDR='Seoul';

 

1) 행 추가하기

package jdbc0625;

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

public class Test06_Test {

	public static void main(String[] args) {
		//sungjuk 테이블 전체 행 갯수를 출력하시오.
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
			Class.forName(driver);				
			con = DriverManager.getConnection(url, user, password); 
			System.out.println("오라클DB 서버 연결 성공!!");
				
			//연습문제 1) 행추가,수정하기
				
			String sno ="SUNGJUK_SEQ.NEXTVAL";
			String name = "손흥민";
			String kor = "95";
			String eng = "80";
			String mat = "75";
			String addr = "UK";
						
			//StringBuilder 사용하기
			StringBuilder value = new StringBuilder();
			value.append(" VALUES(" + sno);
			value.append(",'"+name+"',"+kor+","+eng+","+mat+",'"+addr+"'");
			value.append(","+" SYSDATE ) ");
			System.out.println(value);
								
			//SQL문 작성하기
			StringBuilder sql = new StringBuilder();
			sql.append(" INSERT INTO "); 
			sql.append(" SUNGJUK(SNO,UNAME,KOR,ENG,MAT,ADDR,WDATE) "); 
			sql.append(value); // ? 명령어에 집착했는데 이렇게 해줘도 됨...
				
			pstmt = con.prepareStatement(sql.toString());			
			rs=pstmt.executeQuery(); //SELECT문에서 사용한다. SELECT한 테이블이 담김.				
	
    	if(rs.next()){ //cursor가 존재하는지?
			System.out.println("자료있음");
			do{ //칼럼명으로 접근한다.
				System.out.print(rs.getInt("SNO")+" ");
				System.out.print(rs.getString("UNAME")+" ");
				System.out.print(rs.getInt("KOR")+" ");
				System.out.print(rs.getInt("ENG")+" ");
				System.out.print(rs.getInt("MAT")+" ");
				System.out.print(rs.getInt("AVG")+" ");
				System.out.print(rs.getString("ADDR")+" ");
				System.out.print(rs.getDate("WDATE")+" ");
				System.out.println();
			} while(rs.next());
					
		} else{
			System.out.println("자료없음");
		}
			
	} catch(Exception e){
		System.out.println("실패!" + e);				
	} finally{
		//자원반납(순서주의!!!!) 자원반납할시 역순으로 가장 최근에 실행했던 것부터 반납.
		try{
			if(rs!=null){rs.close();}
		} catch (Exception e){}		
				
		try{
			if(pstmt!=null){pstmt.close();}
		} catch (Exception e){}
				
		try{
			if(con!=null){con.close();}
		} catch (Exception e){}
	}//finally end

	}//MAIN END
}//CLASS END

 

 

 

선생님 풀이.

package jdbc0625;

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

public class Test06_Test {

	public static void main(String[] args) {
	
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
		
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
			Class.forName(driver);				
			con = DriverManager.getConnection(url, user, password); 
			System.out.println("오라클DB 서버 연결 성공!!");
				
			//연습문제 1) 행추가,수정하기
				
			String name = "손흥민";
			int kor = 95;
			int eng = 80;
			int mat = 75;
			int avg = (kor+eng+mat)/3;
			String addr = "UK";
												
			//SQL문 작성하기
			StringBuilder sql = new StringBuilder();
			sql.append(" INSERT INTO SUNGJUK(SNO,UNAME,KOR,ENG,MAT,AVG,ADDR,WDATE) "); 
			sql.append(" VALUES(SUNGJUK_SEQ.NEXTVAL,?,?,?,?,?,?,SYSDATE)"); // ? 명령어에 집착했는데 이렇게 해줘도 됨...
				
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, name);
			pstmt.setInt(2, kor);
			pstmt.setInt(3, eng);
			pstmt.setInt(4, mat);
			pstmt.setInt(5, avg);
			pstmt.setString(6, addr);	
				
			//SQL문 실행 - 추가된 행의 갯수 출력.
			int result = pstmt.executeUpdate();//리턴형 int이다.
			System.out.println("실행결과:"+result); //1행이 추가되었다.
			
			} catch(Exception e){
			System.out.println("실패!" + e);
			}
				
	}//MAIN END
}//CLASS END

 

 

 

풀어보면서 행은 추가가 잘 되었는데 계속 콘솔에 ORA-00900: invalid SQL statement 에러가 떠서

이유를 찾아보았더니 셀렉트할때 출력해주는 내용이 밑에 붙어있어서 그랬다.

셀렉트 내용 출력 부분을 다 지워주고 insert된 행 판별문으로 바꾸어줬더니.

제대로 실행이 되었다.

 

시퀀스 넘버에서 보이는 실패의 기록..ㅠㅠ 

 

 

2) 행 수정하기

package jdbcOracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Test07_Test {

	public static void main(String[] args) {
		// 행수정 연습
		try{
				String url ="jdbc:oracle:thin:@localhost:1521:xe";
				String user ="java0514";
				String password ="1234";
				String driver ="oracle.jdbc.driver.OracleDriver";
				Class.forName(driver);				
				Connection con = DriverManager.getConnection(url, user, password); 
				System.out.println("오라클DB 서버 연결 성공!!");
				
				String addr ="서울";
								
				
				StringBuilder sql = new StringBuilder();
				sql.append(" UPDATE SUNGJUK ");
				sql.append(" SET ADDR=?");
				sql.append(" WHERE ADDR = 'Seoul' ");
				
				PreparedStatement pstmt = con.prepareStatement(sql.toString());
				pstmt.setString(1, addr);
				
				int result = pstmt.executeUpdate(); //UPDATE가 이루어진 행의 갯수.
				if(result == 0){
					System.out.println("행수정 실패");
				}else {
					System.out.println("행수정 성공");
				}

			
			}catch(Exception e){
				System.out.println("실패!" + e);
			}

	}//main end
}//class end

 

결과값은

제대로 수정이 되었다.

 

 

연습문제 2) 행삭제 하기

삭제

int start=1;

int end=3;

아마 between 을 쓰는게 낫지 않을까?

맞았다

 

DELETE FROM SUNGJUK WHERE SNO BETWEEN 1 AND 3;

 

package jdbcOracle;

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

public class Test08_Test {

	public static void main(String[] args) {
		
		String url ="jdbc:oracle:thin:@localhost:1521:xe";
		String user ="java0514";
		String password ="1234";
		String driver ="oracle.jdbc.driver.OracleDriver";
				
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;	
		
	try{
		Class.forName(driver);				
		con = DriverManager.getConnection(url, user, password); 
		System.out.println("오라클DB 서버 연결 성공!!");
				
		int start = 1;
		int end = 3;
				
		StringBuilder sql = new StringBuilder();
		sql.append(" DELETE FROM SUNGJUK ");
		sql.append(" WHERE SNO BETWEEN ? AND ? ");
						
		pstmt = con.prepareStatement(sql.toString());
		pstmt.setInt(1, start);
		pstmt.setInt(2, end);
		
		int result = pstmt.executeUpdate();
		if(result == 0){
			System.out.println("행삭제 실패");
		}else {
			System.out.println("행삭제 성공");
		}
			
		}catch(Exception e){
			System.out.println("실패!" + e);
		}

	}//main end
}//class end

 

결과값

성공적으로 삭제가 되었다.

이클립스로 실행해보기 전에 CMD에서 테스트로

31~33까지 지우는 것을 해봤는데 그것도 적용된 결과이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글