Normalization(정규화)

  • 어떤 테이블을 동일한 식별자를 가지는 여러 개의 테이블로 나누는 과정

Join

  • 연관된 테이블을 연결하여 하나의 테이블처럼 이용
--emp와 dept를 조인해서 emp사람들의 부서명을 구해보자
--1.
select e.empname,d.dname --약어 아닌 원래 테이블명으로도 가능
from emp e,dept d
where e.deptno=d.deptno;
  • 조회문(select)에서 테이블의 고유한 컬럼명일 경우 테이블명 or 약어(e., d.) 생략 가능

부모 & 자식 Table

  • 부모, 자식 테이블의 관계 생성을 위해 하나의 ‘연관 컬럼’ 필요
  • 자식 테이블의 ‘연관 컬럼’은 부모 테이블의 해당 컬럼 내 존재하는 값으로만 구성(무결성 제약 조건)
  • 자식 테이블의 foreign key(외래키)는 부모 테이블의 primary key(기본키) 참조

ON DELETE CASCADE

  • 외래키로 테이블이 연결되어있다 하더라도 부모 테이블의 데이터를 삭제하면 자식 테이블의 데이터까지도 자동으로 삭제해주는 기능
--부모테이블
create table menu(m_num number(5) primary key,
m_name varchar2(20),price number(10));

create sequence seq_menu;
insert into menu values(seq_menu.nextval,'steak',30000);
insert into menu values(seq_menu.nextval,'spagetti',10000);
insert into menu values(seq_menu.nextval,'chicken',25000);
insert into menu values(seq_menu.nextval,'frenchfry',20000);
insert into menu values(seq_menu.nextval,'pickle',1000);
  • 부모 테이블(menu)의 primary key는 m_num 컬럼으로 지정
--자식테이블
--자식테이블에 연결된 부모가 있어도 부모를 삭제 가능, 부모테이블 삭제시 자동으로 자식삭제
create table myorder(o_num number(5) primary key,
m_num number(5) CONSTRAINT order_fk_mnum REFERENCES menu(m_num) ON DELETE CASCADE,
cnt number(5),o_date date);

insert into myorder values(seq_menu.nextval,1,2,sysdate);
insert into myorder values(seq_menu.nextval,2,3,sysdate);
insert into myorder values(seq_menu.nextval,3,1,sysdate);
insert into myorder values(seq_menu.nextval,4,6,sysdate);
insert into myorder values(seq_menu.nextval,5,10,sysdate);
--m_num(외래키) 값에 1~5(부모 테이블 키본키 값) 외의 값 입력 시 무결성 제약조건 위배
  • 자식 테이블(myorder)의 m_num는 foreign key로 지정(REFERENCES)
  • 자식 테이블에 연결된 부모가 있어도 이와 무관하게 삭제할 수 있고, 자식도 자동 삭제하기 위해서는 ‘ON DELETE CASCADE’ 조건을 연관 컬럼(m_num)의 제약 조건으로 설정
  • ON DELETE CASCADE 제약 조건 없는 상태에서 자식 테이블에 연결된 부모가 존재하는데 해당 값을 부모 테이블에서 삭제 시도 시 ‘무결성 제약조건(RHEEMINGYU.ORDER_FK_MNUM)’ 위배
--최종출력
--주문번호  음식명   가격  개수  주문일자
select o_num,m_name,to_char(price,'L999,999'),cnt,o_date
from menu,myorder
where menu.m_num=myorder.m_num;

부모 & 자식 Table 삭제

--board를 먼저 삭제
drop table board; --외래 키에 의해 참조되는 고유/기본 키가 테이블에 있습니다

--자식
drop table answer; --외부키로 연결된 경우 자식테이블 먼저 삭제후 부모테이블 삭제가능
  • 테이블 자체 삭제는 구조에 관련된 사항이므로 ON DELETE CASCADE와 무관
  • 부모 테이블(board)을 먼저 삭제하려면 삭제 불가
  • 자식 테이블(answer) 삭제해야 부모 테이블 삭제 가능

JDBC(Java DataBase Connectivity)

  • Driver, URL, SQL username, password 필요
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
  • JDBC를 위해 import한 클래스
public class QuizConnectNewBoard {

	static final String URL="jdbc:oracle:thin:@localhost:1521:XE";
public void connectSnsBoard() {
		
		Connection conn=null;
		Statement stmt=null;
		ResultSet rs=null;
		
		String sql="select b_num,nick,subject,content,wday from snsboard";
  • Connection, Statement, ResultSet 각각 생성
  • SQL 쿼리문 변수화
		try {
			conn=DriverManager.getConnection(URL,"RheeMingyu","a1234");
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql);
			
			System.out.println("b_num\tnick\tsubject\tcontent\twday");
			while(rs.next()) //true 값 반환, 더 이상 데이터 없으면 false 반환
			{
				// db로부터 데이터 가져오기
				int b_num=rs.getInt("b_num"); //컬럼명 or 열변호
				String nick=rs.getString("nick");
				String subject=rs.getString("subject");
				String content=rs.getString("content");
				String wday=rs.getString("wday");
				
				System.out.println(b_num+"\t"+nick+"\t"+subject+"\t"+content+"\t"+wday);
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(conn!=null) conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
  • try~catch는 즉각 실행

  • Connection(conn)에서 URL, username, password를 매개변수로 입력

  • ResultSet(rs)에서 변수화한 SQL 쿼리문 매개변수로 입력

  • rs.next()는 true 값 반환 후 더 이상 데이터 없으면 false 반환

  • finally에서 클래스 닫을 시 if(~~≠null)는 생략 가능(null이면 닫을 필요도 없으므로)

public static void main(String[] args) {

		QuizConnectNewBoard qcnb=new QuizConnectNewBoard();
		qcnb.connectSnsBoard();
	}
}
profile
초보개발자

0개의 댓글