본문 바로가기
Backend

06월 26일 목 | SW활용 09 - MySQL로 DB연습, MongoDB

by 구라미 2019. 6. 27.

MySQL로 DB연습, MongoDB

MySQL설치 후 자바로 연동하고 DB실습

MongoDB 실습해보기.

 


MySQL 실행하기

1. MySQL서버를 실행하고, 로그인 한 후 어제 만든 SUNGJUK 테이블이 있나 확인한다.

 

- SHOW DATABASES와 

- SHOW TABLES로 있나 확인하니 테이블이 없었다.

 

 

2. 경로 잡아주고 다시 조회해보기

어제 java0514라는 DB에 테이블을 만들었는데 거길 가지 않고 찾으니 나오지 않는 것이었다.

USE JAVA0514; 명령어로

DB를 바꿔준 후 테이블 조회를 해보니 SUNGJUK이란 테이블이 생성된 것이 보인다.

 

SELECT * FROM SUNGJUK 으로 조회해보면

어제 데이터를 삽입했던 정보가 조회된다.

 

 

◆ MySQL DB 서버시작

-> D:\java0514\mysql-5.6\bin 에서 mysqld.exe 실행해서 서버열기

-> 작업관리자에서 프로세스 진행 중인 것 확인

 

 MySQL DB 서버중지

-> 작업관리자에서 프로세스(mysqld.exe) 끝내기

 

 실행하기

>mysql -u root -p

>1234

>SHOW DATABASES;

>USE JAVA0514

>SHOW TABLES;

>SELECT * FROM SUNGJUK;

 

 데이터 추가삽입하기

INSERT INTO SUNGJUK(UNAME,KOR,ENG,MAT,ADDR,WDATE)

VALUES('이세영',87,95,84,'SEOUL',NOW());

 

 

 

 

MySQL과 자바 이클립스 연동하기 실행하기

1. MySQL-connector-java-5.1.47 다운받기

 

MySQL의 자바 라이브러리가 있다.

자바와 연결해준다. 

 

 

2. 이클립스 실행하고 라이브러리 연결하기

 

 MySQL java 라이브러리를 추가하기.

-> 우클릭 -> Build Path -> Configure Build Path

-> external class folder로 다운받고 압축 푼 MySQL-connector-java-5.1.47 열기

-> Add External JARs..

-> 반드시 jar 파일을 연결해야한다!

 

 

 

라이브러리 연결 후

Oracle에서 DB오픈 했던데로 카피해서 MySQL에 맞게 코드를 수정한다.

참고) jdbc https://seaweedisland.tistory.com/49

 

 

package jdbc0627;

import java.sql.DriverManager;

public class Test01_DBOpen {

	public static void main(String[] args) {
		//JDBC(Java Database Connection)
		//java와 데이터베이스를 연동
		
		try{
			
			//1) MySQL DB 연결 관련 정보
			String url ="jdbc:mysql://localhost:3306/java0514?useUnicode=true&characterEncoding=euckr"; //2byte 언어
			String user ="root";
			String password ="1234";
			String driver ="org.gjt.mm.mysql.Driver";
		
			//2)드라이버 로딩
			Class.forName(driver);
			
			//3) MySQL DB 서버 연결
			DriverManager.getConnection(url, user, password);
			System.out.println("MySQL DB 서버 연결 성공!!");
		
		
		}catch(Exception e){
			System.out.println("MySQL DB 연결 실패!" + e);
		}

	}//main end
}//class end

 

이렇게 하면 연동이 성공했다는 메시지가 출력된다.

 

 

3. Java로 MySQL 데이터 삽입하기

 

연동을 성공했다. 이제 자바로 MySQL 데이터를 삽입해볼 것이다.

 

연습문제 1) 행 추가하기

행을 추가하는 예제

package jdbc0627;

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

public class Test02_Insert {

	public static void main(String[] args) {
		//JDBC(Java Database Connection)
		//java와 데이터베이스를 연동
					
		//1) MySQL DB 연결 관련 정보
		String url ="jdbc:mysql://localhost:3306/java0514?useUnicode=true&characterEncoding=euckr"; //2byte 언어
		String user ="root";
		String password ="1234";
		String driver ="org.gjt.mm.mysql.Driver";
						
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("MySQL 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(UNAME,KOR,ENG,MAT,AVG,ADDR,WDATE) "); 
				sql.append(" VALUES(?,?,?,?,?,?,now())");
				
				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

 

성공적으로 행이 추가되었다.

 

 

 

연습문제 2) 상세조회 sno가 n번인 행을 조회하시오.

테이블을 조회하는 예제

자바로 테이블을 조회해볼 것이다. 새로운 조회하는 클래스를 생성해서 조회한다.

package jdbc0627;

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

public class Test03_Select {

	public static void main(String[] args) {
		//JDBC(Java Database Connection)
		//java와 데이터베이스를 연동
					
		//1) MySQL DB 연결 관련 정보
		String url ="jdbc:mysql://localhost:3306/java0514?useUnicode=true&characterEncoding=euckr"; //2byte 언어
		String user ="root";
		String password ="1234";
		String driver ="org.gjt.mm.mysql.Driver";
						
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("MySQL DB 서버 연결 성공!!");
				
				//연습문제 2) 상세조회 sno가 n번인 행을 조회하시오.
				int num = 3;
				
				StringBuilder sql = new StringBuilder();
				sql.append(" SELECT SNO,UNAME,KOR,ENG,MAT,TOT,AVG,ADDR,WDATE ");
				sql.append(" FROM SUNGJUK ");
				sql.append(" WHERE SNO = ? ");
									
				pstmt = con.prepareStatement(sql.toString());
				pstmt.setInt(1, num); //변수에서 불러옴				
				
				rs=pstmt.executeQuery();
			
				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("TOT")+" ");
						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

 

int num = 3;

변수에 3을 넣어주었으므로 sno가 3인 행이 출력된다.

성공적으로 출력되었다.

 

 

 

 

연습문제 3) 전체 목록을 SNO의 내림차순으로 조회하기

 

package jdbc0627;

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

public class Test04_SelectAll {

	public static void main(String[] args) {
		//JDBC(Java Database Connection)
		//java와 데이터베이스를 연동
					
		//1) MySQL DB 연결 관련 정보
		String url ="jdbc:mysql://localhost:3306/java0514?useUnicode=true&characterEncoding=euckr"; //2byte 언어
		String user ="root";
		String password ="1234";
		String driver ="org.gjt.mm.mysql.Driver";
						
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //
		
		try{				
				Class.forName(driver);				
				con = DriverManager.getConnection(url, user, password); 
				System.out.println("MySQL DB 서버 연결 성공!!");
				
				//연습문제 3) 전체 목록을 조회하시오.
				
				StringBuilder sql = new StringBuilder();
				sql.append(" SELECT SNO,UNAME,KOR,ENG,MAT,TOT,AVG,ADDR,WDATE ");
				sql.append(" FROM SUNGJUK ");
				sql.append(" ORDER BY SNO DESC ");
									
				pstmt = con.prepareStatement(sql.toString());
				
				rs=pstmt.executeQuery();
			
				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("TOT")+" ");
						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

 

성공적으로 출력되었다.

 

연습문제 4) TOT,AVG 채워넣기

DB에서 업데이트 하겠다.

UPDATE SUNGJUK SET TOT=KOR+ENG+MAT;
UPDATE SUNGJUK SET AVG=TOT/3;

 

 

 

 


*다시 오라클에서 실습하였다.

SubQuery(서브쿼리)

1. 서브쿼리란?

쿼리문 안에 또 다른 쿼리문이 오는 것이다.

 

1) 국어점수의 평균을 구하시오

SELECT AVG(KOR) FROM SUNGJUK;

 

2) 제주지역의 국어점수의 평균을 구하시오

SELECT AVG(KOR) FROM SUNGJUK WHERE ADDR='JEJU';

 

 

3) 국어점수의 평균보다 못한 것을 찾기

WHERE KOR<국어점수평균(아까 구한 74.6055556) 이라는 조건을 넣기

이렇게 쿼리안에 또 쿼리를 넣는 것.

SELECT KOR FROM SUNGJUK WHERE KOR<(SELECT AVG(KOR) FROM SUNGJUK);

이렇게 결과가 출력되었다.

 

평균보다 더 잘하는 사람을 조회해보면

이런식으로 쿼리안의 쿼리로 정보를 가공할 수 있다.

* String 값으로 들어간 것은 대소문자 구분하니 조심.

 

 

 

4) 제주지역의 영어점수 평균보다 잘한 레코드를 조회

SELECT UNAME,ENG FROM SUNGJUK WHERE ENG>(SELECT AVG(ENG) FROM SUNGJUK WHERE ADDR='Jeju');

 

 

 

5) 수학점수의 최고점이 국어점수에도 있는지 조회

SELECT UNAME,KOR FROM SUNGJUK WHERE KOR=(SELECT MAX(MAT) FROM SUNGJUK);

 

확인해보기

현재 테이블을 전체 조회하면

 

수학점수 최고점은 90점이다.

이 점수가 국어점수에 있는 사람을 조회해보면

 

 

 

 

이런 결과가 나온다.

 

 

6) TOT 칼럼 추가하기, NVL()함수

TOT

ALTER TABLE SUNGJUK ADD (TOT NUMBER);

SELECT TOT FROM SUNGJUK;

 

2. NVL()함수

SELECT MAX(TOT) FROM SUNGJUK; --TOT값이 비어있어서 빈값 나옴.

SELECT COUNT(TOT) FROM SUNGJUK; --0 나옴.

 

MAX(TOT)값이 아예 안나온다.

NVL()함수는 NULL값을 다른 값으로 치환해주는 함수이다.

 

 

1) NVL()함수 이용하기

SELECT NVL(MAX(TOT),0) FROM SUNGJUK;

->MAX값을 0으로 바꾸어주어라 라는 뜻

실행하였더니 0이 출력되었다.

 

SELECT NVL(MAX(TOT),0)+1 FROM SUNGJUK;

->0에 1을 더해라?? 그럼 값이 1이 나올까?

실행되나 확인해보자.

 

SELECT NVL(MAX(TOT),0)+1 AS NUM FROM SUNGJUK;

이 함수는 일련번호 넣을 때 사용한다.

 

 

 

2) MAX()를 이용해서 SNO 일련번호 발생

SELECT MAX(SNO) FROM SUNGJUK;

내 테이블에서 가장 큰 순번은 30이다.

여기에 NVL()함수를 통해 수를 추가해보면

1이 추가되어 31이 되었다.

 

SELECT MAX(TOT)+1 FROM SUNGJUK;

SELECT NVL(MAX(TOT),5)+1 FROM SUNGJUK; --이렇게 하면 NULL이 5로 변화하고 그 다음 1을 더해주어 6이된다.

 

UPDATE SUNGJUK SET SNO = 12 WHERE UNAME='손흥민'; <- 혼자만 30번대라서 이렇게 우선 변경했음

 

 

3) MAX()를 이용해서 SNO 일련번호 발생한 후 행추가 하기

INSERT INTO SUNGJUK (SNO,UNAME,KOR,ENG,MAT,ADDR,WDATE)

VALUES((SELECT NVL(MAX(SNO),0)+13 FROM SUNGJUK),'김연아',94,80,85,'Jeju',SYSDATE);

 

SELECT SNO,UNAME FROM SUNGJUK ORDER BY SNO DESC;

서브커리가 올때 괄호로 묶기.

데이터가 없을 경우를 대비해 0을 대입하는 것이다. 

 

 

4) 위 쿼리문을 MySQL쿼리문으로 짜서 실행해보기

만약 위 쿼리문을 MySQL쿼리문으로 변경한다면?

 

INSERT INTO SUNGJUK (SNO,UNAME,KOR,ENG,MAT,ADDR,WDATE)

VALUES((SELECT COALESCE(MAX(SNO),0)+1 FROM SUNGJUK A),'김연아',94,80,85,'Jeju',NOW());

 

IFNULL(MAX(SNO),0)

이라고 해도 된다.

 

김연아 행에 3(번호 중 최고값,마지막값)에 1이 더해진 즉 다음번호가 부여되었다.

SUNGJUK에 임의로 별칭을 지정해줘야한다 (AS의 개념이 맞다, AS는 생략이 가능하다.)

 

 

 

 

 


MongoDB 연동하기

1. MongoDB 설치하기 

- MongoDB 공식홈페이지 > Try Free > 서버

- 3.2.22버전, os windows 64bit, msi 로 다운받기

 

 

  1) 폴더생성 c:\data\db

  2) 몽고DB 서버실행
     cmd
     cd C:\Program Files\MongoDB\Server\3.2\bin>mongod

  3) 몽고DB 실행
     cmd
     cd C:\Program Files\MongoDB\Server\3.2\bin>mongo  

  4) 에러상황 mongod.exe - 시스템 오류

    - windows server 2012 r2 64bit 에서 bin폴더에서 서비스 등록시 아래와 같은 에러 발생
    - 구글 검색시 이것은 Visual C++ Redistributable for Visual Studio 2015 재배포패키지가 윈도우에
      기본적으로 없다는 얘기가 있어서 재배포패키시 (64bit)설치        
      https://www.microsoft.com/en-us/download/details.aspx?id=48145
      
      재배포패키지 설치후 서비스 실행을 확인함

 

 

2. MongoDB는 NoSQL DB이다.

 

NoSQL Database

-> 구조가 없다

-> JSON 구조

-> 몽고DB에 저장되는 형태는 JSON문법을 따른다

 

{이름:손흥민, 나이:25, 직업:축구선수, 주소:영국} 안에 

{이름:김연아, 성별:여, 직업:피겨선수}

{이름:박지성, 전화번호:01012345678, 결혼:기혼}

 

Key와 Value

해시맵 구조이다. 

Key값을 부르면 Value가 나오는 것.

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글