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가 나오는 것.
'Backend' 카테고리의 다른 글
07월 18일 목 | SQL활용 01 - SQL Developer 기본사용 (0) | 2019.07.18 |
---|---|
06월 26일 금 | SW활용 10 - MongoDB 이클립스 연동하기 (1) | 2019.06.28 |
06월 25일 수 | SW활용 08 - MySQL과 DB연습Ⅱ (0) | 2019.06.26 |
06월 25일 화 | SW활용 07 - NCS 시험범위와 DB연습Ⅰ (0) | 2019.06.25 |
06월 24일 월 | SW활용 06 - 데이버베이스 생성과 삭제 (0) | 2019.06.24 |
댓글