SQL은 DB의 데이터를 관리하기 위해 사용하는 명령어들이다. 모든 데이터베이스들은 비슷한 SQL문을 사용한다.


◆ SQL (Structured Query Language)

DB를 관리할 수 있는 명령어 ( SQL문은 대소문자를 구분하지 않는다. )


◆ DDL (Data Definition Language) 데이터 정의 명령문

사용할 객체(테이블)를 생성, 변경, 삭제 하는데 쓰이는 명령문( CREATE, ALTER, DROP )이다.

오라클 기준으로 생성시키는 객체들은 아래와 같은 것들이 있다.

  • table : 저장용 객체
  • sequence : 번호 생성 객체
  • view : 조회결과 저장용 객체


▶ DDL - 테이블 생성(CREATE)

 create table 테이블이름( 컬럼명 타입, 컬럼명 타입, ...);
=> 왼쪽 테이블탭을 우 클릭하여 만들 수도 있으며,
타입은 문자(varchar2), 숫자(number) - 정수/실수, 시간(date) 등이 있다.

create table baby(
name varchar2(12), -- varchar2 문자열 (한글3, 영어1 )
gender number(1,0), -- number 수치(전체자리수,소수점아래 할당부분)
weight number(3,2),  -- number수치
birth date -- 시간을 저장
);
  • 컬럼/타입의 구분은 컴마(,)로 하며 마지막 컬럼/타입은 콤마를 찍지 않는다. )
  • sql의 주석은 ‘—’ 로 처리한다.


▶ Oracle의 데이터 타입

  • 문자형 데이터 타입
    varchar2(byte)


    => 영어는 1바이트 당 한 글자, 한글은 3바이트 당 한 글자
    즉, 한글 3글자는 varchar2(9)
    (varchar형은 가변길이이기 때문에 괄호 안 숫자는 최대 길이 )

  • 수치형 데이터타입
    number(전체 자리 수, 소수점아래 할당부분)


    ex ) number(1,0) 한자리수 정수, number(3,2) => ex) 3.12

  • 시간 형 데이터 타입
    date


▶ DDL – 테이블 변경(ALTER)

  • alter table 변경할 테이블 명 drop column 삭제 할 컬럼;

    : ex ) alter table baby drop column birth;
    => ‘baby’ 테이블의 ‘birth’라는 컬럼을 삭제

  • alter table 변경할 테이블 명 add (컬럼명 컬럼 타입);

    : ex ) alter table baby add (birth date);
    => ‘baby’ 테이블의 ‘birth’라는 컬럼을 date타입으로 추가


▶ DDL – 테이블 삭제(DROP)

 drop table 삭제할 테이블

ex ) drop table baby; => ‘baby’테이블을 삭제

  • desc 테이블
    테이블의 정보 확인
    ex ) desc baby;
    => ‘baby’ 테이블의 형태를 확인


◆ DML (Data Manipulation Language) 데이터 조작 명령문

테이블 객체 관련 DML( 추가(INSERT), 삭제(DELETE), 변경(UPDATE), 조회(SELECT) )
데이터의 추가,삭제,변경,조회를 CRUD라고 한다.


▶ CREATE - 데이터 삽입 (INSERT)

 insert into 테이블명(컬럼,컬럼...) values(값,값,..)
또는
insert into 테이블명 values (값,값 .. )

  • 값은 홑따옴표( ‘ ‘ )안에 작성, null값은 홑따옴표를 적지 않으며 ‘ ’ 는 null과 같다.
  • 값을 순서대로 넣을때는 컬럼값을 입력하지 않아도 된다.
// name, gender, weight birth 속성 테이블의 여러 삽입 예제
insert into baby(name, gender, birth) values('김루피', '0', '2018-01-05');
insert into baby(name, gender, weight) values('바크조로', '1', '3.14');
insert into baby(name, gender, weight, birth) values('바크조로', '1', '3.141592','2018-01-05' );
insert into baby(name, gender, weight, birth) values('이나미', '0', '2.42','2017/01/05' );
insert into baby values('조상디', '0', '2.44', '2017/1/1');
  • (SqlDeveloper)왼쪽 테이블 탭에서 더블클릭으로 테이블의 데이터를 확인할 수 있고, 그 안에서 변경 또한 가능하다.
  • 테이블을 만들 때 정의했던 데이터 형식과 일치해야 저장이 되지만, 소수부는 알아서 반올림 처리되기 때문에 자릿수가 넘어가도 상관없이 처리된다.
    ex ) number(3,2) => 1.32123 (가능) , 32.123 (불가능)


▶ READ - 데이터 조회(SELECT)

  • select 컬럼, 컬럼 ... from 테이블

    : 해당 테이블의 해당 컬럼만 뽑아서 보여줌

  • select * from 테이블

    : 해당 테이블의 모든 열을 다 뽑아서 보여줌

select * from baby;
select name from baby;


▶ UPDATE - 데이터 변경

 update 테이블명 set 컬럼=변경할 값, 컬럼=변경할값 ...;

update baby set gender = '1';  

위 명령어는 모든 행의 gender를 1로바꾸지만, where절을 이용하여 조건을 설정할 수도 있다.


▶ DELETE - 데이터 삭제

 delete from 테이블
테이블 전체 열( 데이터 행 )을 삭제 ( rollback 가능 )
마찬가지로 where절과 같이 사용하는것이 일반적


◆ DCL (Data Control Language) 데이터 제어 명령문

DML로 했던 작업을 되돌리거나, 저장시키는 명령문 ( ROLLBACK, COMMIT )

▶ ROLLBACK

마지막 COMMIT 시점으로 돌아감. ( COMMIT 시점 뒤로는 돌아갈 수 없음 )
ex ) rollback;


▶ COMMIT

실제로 메모리에 저장
=> DB에서는 가상 작업으로 COMMIT 시키지 않으면 실제로 저장되지 않고, 자바에서 작업할 경우에는 바로바로 COMMIT 작업을 시켜버리기 때문에 DB에서 COMMIT시키지 않은 상태에서 자바에서 작업할 경우 렉이 걸릴 수 있다.


◆ 데이터베이스 키워드

▶ Date타입에 현재시간 넣기

데이터베이스 date타입의 데이터를 넣을 때 sysdate를 값으로 넣게 되면 현재시간으로 들어가게 된다.
JDBC에서 사용할 때도 스트링으로 “sysdate”를 넣어주면 같은 효과가 발생한다.

insert into table(nowdate) values(sysdate);


▶ 외래키를 설정할 시

  • on delete cascade
    부모 데이터 삭제 시 계단식 삭제
  • on delete set null
    부모 데이터 삭제 시 null로 설정

▶ 증가하는 number값이 필요할 시 ( 시퀀스 객체 )

Oracle은 데이터베이스 내에서 증가하는 시퀀스 객체를 생성해야 한다.

  • 생성
    create sequence 증가 값 객체 변수 명;
create sequence follow_sequence;

// 1000부터 시작하도록 생성
create sequence 변수  start with 1000;

// 1000부터 시작하여 10 증가하는 시퀀스 객체 생성
create sequence 변수  start with 1000 increment by 10; 
  • insert
    증가 값 객체 명.nextval
insert into follow values(follow_sequence.nextval, '오리', 'qkqh');

주의) 삽입 실패 시에도 값은 증가된다.

  • follow_sequence.currval
    현재 시퀀스 값 반환
    => JDBC에서도 String형으로 똑같이 써주면 된다.


▶ DB의 DATE타입 비교 시

2018-01-30 이하로 비교할 시 2018-01-30 00시00분00초 이하로 비교하기 때문에 그 이후 데이터는 나오지 않게 되므로 주의!