레이블이 kosta db인 게시물을 표시합니다. 모든 게시물 표시
레이블이 kosta db인 게시물을 표시합니다. 모든 게시물 표시

2016년 10월 6일 목요일

52day / DB / Subquery

www.c-sharpcorner.com

Subquery

: Praent Query에 종속되어있는 Inner Query
  • 게시판을 만들다가 Subquery를 배워야하는 이유?
간단히 말하면 페이징 때문이다.
게시판에 글 목록을 보통 10개씩 지정해 놓는다.

만약 그러지 못할 경우?? Subquery를 쓰지 못할 경우??
DB에 게시판의 글이 100개 1000개 10000개가 있을 경우에
비주얼적으로 수많은 글을 한 페이지에 담을 사람은 없을 것이다.
하지만 편법을 쓴다면 일단 DB에서 모든 게시글을 가져온 다음에
Controll이나 View에서 원하는 만큼만 보여줄 수 있다.

이렇게 한다면 당연히 DB에 좋지 않을 것이며 굉장히 무거운 웹사이트가 될 것이 분명하다.

그래서 Subquery로 어떻게?
View -> 원하는 만큼만!! 요청하도록 한다.
Controll -> 원하는 만큼만 전달하도록 한다.
DB -> 당연히 요청한 부분만 조회해온다.

budget 의 최고액을 조회 
SELECT max(amount) FROM budget;
가장 높은 액수(amount)로 지출된 내역(contents)은? 
SELECT contents FROM budget WHERE amount = 25000;
subquery를 이용해서 조회한다 
평균액수(amount)보다 많은 금액과 내역을 조회 
SELECT avg(amount) FROM budget;
SELECT amount,contents FROM budget WHERE amount>17600;
위 두 sql을 Subquery를 이용해 한번에 정의 ( 내림차순 정렬 ) 
SELECT amount,contents FROM budget 
WHERE amount > (SELECT avg(amount) FROM budget)
ORDER BY amount DESC;
연습) 전체 내역의 평균액수보다 낮은 내역 중 가장 높은 액수의 내역은?
SELECT contents,amount FROM budget ORDER BY amount DESC;
1) 평균금액 조회
        SELECT AVG(amount) FROM budget; -- 17600
2) 평균금액보다 작은 내역의 최고액을 조회
        SELECT MAX(amount) FROM budget
        WHERE amount < 17600-- 15000
그 금액에 해당하는 내역을 조회  
        SELECT contents FROM budget 
        WHERE amount = 15000;
위 sql을 Subquery를 이용해 한번에 정의
SELECT contents FROM budget 
    WHERE amount = (
        SELECT MAX(amount) FROM budget
        WHERE amount < (
            SELECT AVG(amount) FROM budget
    )
)
cs

2016년 8월 31일 수요일

30day / DB / Transaction

http://www.slideshare.net/alexbaranau/transactions-over-hbase
  • Transaction 제어 : Transaction 이란 작업단위를 의미 

주요 용어
  1. commit : 실제 데이터베이스에 반영 
  2. rollback : 작업 취소 

JDBC 는 AUTO COMMIT 이 기본이다
Transaction 제어가 필요한 경우에는
AUTO COMMIT을 해제하고 수동 커밋 모드로 처리한다

onnection.setAutoCommit(false); <--수동 커밋 모드로 변경 
작업 단위 내에서 모든 작업이 정상 수행시
connection.commit(); 
문제 ( 에러 또는 예외 ) 가 발생
connection.rollback(); 
try {
    카드발급 & 포인트발급 
    commit
catch (Throwable t) { 
    rollback 
cs

  • 사례 ) 카드 발급과 동시에 일정한 포인트가 함께 발급되어야 한다 
if ( 카드 발급 후 문제가 발생하여 -> 포인트 발급 누락 ) {
 -> 발급된 카드 작업은 취소(rollback)되도록 처리 }
else if (카드 및 포인트 발급 작업이 모두 정상 수행) {
실제 데이터베이스에 반영(commit)하도록 트랜잭션(작업단위)을 제어한다 }
cs

2016년 8월 30일 화요일

29day / DB / Sequence

http://www.dbarepublic.com
  • 오라클 시퀀스(sequence) 
  1. 유일한 값을 생성해준다 
  2. 주로 primary key 값을 생성할 때 사용한다 
  3. 시퀀스는 일련의 번호를 순차적으로 증가시킨다 
  4. 테이블과 독립적으로 생성하고 저장된다 

시퀀스 생성: create sequence 시퀀스명 
create sequence seq_test; 
 
시퀀스 삭제  
drop sequence seq_test; 
cs

  • dual table
오라클에서 제공하는 기본 테이블 varchar2 타입의 컬럼하나로
구성된 테이블로 주로 함수 실행 용도로 많이 사용된다
dual table을 이용해 시퀀스를 증가시켜본다

시퀀스 증가 : 시퀀스명.nextval 
select seq_test.nextval from dual; 
cs

  • 참고) 시퀀스 현재값 : 시퀀스명.currval 
단독적으로 사용불가
반드시 하나의 세션(커넥션)안에서 nextval실행 후 currval를 실행해야한다.

select seq_test.currval from dual; 
cs


시퀀스 생성
create sequence memo_seq; 
시퀀스 제거
drop sequence memo_seq; 
cs


2016년 8월 29일 월요일

2016년 8월 26일 금요일

27day / DB / Management

http://www.sitesbay.com
  • Database와 jdbc를 이용한 회원관리
SQL 과 JDBC 를 이용해 회원 정보를
CRUD(create,read,update,delete) 하는 어플리케이션을 구성해본다 

  • Application 구성
  1. TestMemberDAO
  2. MemberDAO
  3. MemberVO 
  4. Database
     
  참고)  DAO : Data Access Object : 데이터베이스 연동을 담당하는 객체
    VO : Value Object 
    DTO : Data Transfer Object 
  

Table 생성

  • Datatype
  1. varchar2(9) 문자열 데이터타입 / 9는 영문기준 9자 까지
  2. number 숫자 데이터 타입
  • 제약조건(constraint)
  1. primary key (pk, 주키) unique + not null
  2. not null(반드시 데이터가 있어야 한다)

CREATE TABLE typetest(
name VARCHAR2(9) primary key,
money NUMBER not null
)

  • insert
영문운 9자까지, 한글은 3자까지 가능하다(선언)

insert into typetest(name,money) values('하하하',100);
insert into typetest(name,money) values('abcdefghi',100);

오라클 함수

  • product 총 수량
select count(*) from product;

  • product price의 최고가
select max(price) from product;

  • product price의 최저가
select min(price) from product;

  • product price의 평균가
select avg(price) from product;

  • product price의 평균가 반올림
select round(avg(price)) from product;
  • product price의 평균가 소수점 이하 올림
select ceil(avg(price)) from product;
  • product price의 평균가 소수점 이하 내림
select floor(avg(price)) from product;



정렬(오름차순)

  • 상품 가격 오름차순으로 product 정보를 조회
select id,name,maker,price from product order by price asc;

  • 상품 가격 내림차순으로 product 정보를 조회
select id,name,meker,price from product order by price desc;

  • maker가 삼성인 product의 id,name,price를 조회하되 price 내림차순으로 정렬
select id,name,price from product where id ='삼성' order by price desc;

  • price가 130 이하인 product의 정보를 조회
select id,name,maker,price from product where price <= 130;

  • price가 100을 초과하고 120 이하인 product 정보 조회
select id,name,maker,price from product where price > 100 and price <= 120;

  • maker의 종류를 조회
select distinct(maker) from product;

  • 특정 id에 해당하는 product 정보 유무 -> pk이므로 존재하면 1 아니면 0을 반환
select count(*) from product where id ='d';

2016년 8월 25일 목요일

26day / DB / JDBC

http://www.sitesbay.com
  • JDBC : Java Database Connectivity
자바 어플리케이션과 데이터베이스와의 연동을 위한 기술

Java Application - JDBC ---SQL-- Database 
  • JDBC 개발단계 
1. 드라이버 로딩 : 데이터베이스와 자바어플리케이션 연동을 위한 초기 정보를 적재
ex)
Class.forName(driverClassName); 
cs
2. 컨넥션 : 연동할 데이터베이스와의 연결
ex)
Connection con = DriverManager.getConnection(dbUrl,id,password);
cs
3. PreparedStatement: SQL 실행
ex)
String sql = "SELECT name FROM member WHERE id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1,"java"); 첫번째 물음표에 정보할당 
ResultSet rs = pstmt.executeQuery();
cs
4. ResultSet : 조회한 결과 정보 
ex)
if(rs.next()){  rs.next() : 결과행이 존재하면 true 
    rs.getString(1);  조회한 컬럼순서에 해당하는 데이터 반환 
or
    rs.getString("name");   조회 컬럼명에 해당하는 데이터 반환 
}
cs