데이터베이스와 프로그래머가 대화하는 언어
Emp 또는 List<Emp>
select 열이름 from 테이블이름 where 조건 order by 정렬;
-- public List<EMP> read() { }
select empno, ename, job, sal from emp where sal>=3000;
-- JPA 같은 경우 기본적으로 컬럼을 지정못한다.
select * from emp where sal>=3000;
-- 조건절where의 ?는 사용자에게 값을 받아오는 것
--List<EMP> read1(int sal) Java의 sal 값이 아래에
--인덱스 없는 검색 → table access full
select * from emp where sal>=?;
-- EMP read2()
--기본키를 이용한 검색 → 기본키니까 결과는 1개 → 검색이 종료
select * from emp where empno=?;
-- 이름으로 검색한다면
-- rownum=1 하나를 찾고 검색 종료
select * from emp where ename='SMITH' and rownum=1;
테이블의 각 컬럼은 도메인(값의 범위)을 정의할 수 있어야 한다. 예를 들어 emp의 deptno의 경우는 외래키이므로 null 또는 dept 테이블의 deptno만 입력가능. 토정비결에서 년, 월, 일, 시를 도메인을 정의해서 <select>
로 입력받는 것이 바람직하다. 컬럼은 원자값(분리 불가능한 값)을 가져야 한다.
문자열, 숫자, 날짜. 날짜는 형식을 갖춘 문자열이다.
select * from where hiredate>='1981-07-01';
select * from where hiredate>='81-07-01';
select * from where hiredate>='81/07/01';
from → where → select → order by(는 매우 느린 작업이므로 꼭 필요한 경우가 아니라면 사용하지 말자)
계산식에 null이 포함되면 결과는 무조건 null
select emp.*, nvl(sal+comm, sal) from emp;
=select emp.*, sal+nvl(comm,0) from emp;
문자열을 포함하는 상위카테고리에 속하는 모든 하위를 지정하는 정도. 인덱스를 사용할 수 없는 매우 느린 연산.
create table em01 (
empno number(4),
ename varchar2(20),
sal number(7,2)
);
--숫자는 number(자리수, 소수점이하 자리수)
--문자열은 고정길이 문자열char(10), 가변길이 문자열varchar2(10)
--char(10) 'hello ' → 즉시 10바이트
--varchar(10) 'hello' → 최대 10바이트
create table em02 (
--컬럼 레벨로 제약조건 지정하기
empno number(4) constraint em03_pk_empno primary key,
ename varchar2(10 char) not null,
gender char(3) default '여',
hiredate date default sysdate
);
--varchar2(10 char) → 최소 10바이트에서 최대 30바이트
--한글 1글자는 3바이트
--LOB: 대용량 데이터 컬럼
--BLOB: 최대 4GB 바이너리(이진) 데이터
파일을 직접 저장하면 테이블 크기가 매우 커질 수 있다.
→ 보통 파일은 디스크에 저장하고 파일명을 문자열로 저장한다.
--CLOB: 최대 4GB 문자열 데이터
--컬럼 뒤에 기본키나 not null등을 지정하는 것 → 컬럼 레벨
--empno number(4) primary key;
--SYS_일련번호 형식으로 제약조건 이름이 생성된다.
--not null 제약조건은 컬럼 레벨로만 지정가능
create table em03 (
--테이블 레벨로 제약조건 지정하기
empno number(4),
ename varchar2(10 char) not null,
constraint em03_pk_empno primary key (empno),
--테이블 레벨로 deptno를 dept.deptno로 참조하는 외래키로 지정
constraint em03_fk_emp foreign key(deptno) REFERENCES dept(deptno)
);
create table em04 (
empno number(4),
deptno number(2),
info clob,
--기본키가 복합 컬럼인 경우 컬럼 레벨로는 생성을 못한다.
--복합 컬럼 기본키에 대한 인덱스는 컬럼을 적은 순서대로 만들어진다.
--empno가 있어야만 deptno에 대해 인덱스를 탈 수 있다.
constraint em04_pk primary key(empno, deptno)
);
실패여부를 떠나서 무조건 1씩 증가 → 일련번호로 자주 활용
create sequence board_seq minvalue 0;
--시퀀스의 값을 읽어와야 사용할 수 있다.
select board_seq.nextval from dual; // 0
create table bb (
bno number(4) primary key,
content varchar(100 char)
);
indert into bb vlues(board_seq.nextval, 'hello');
commit;
select * from bb;
JDBC는 자바와 데이터베이스를 연결하는 표준
미리 만들어 놓고 사용하는 것
자바, 서블릿, 스프링MVC에서 어떤 라이브러리를 추가하면 추가하고 끝(동작은 안한다). 하지만 스프링부트는 자동 설정을 지원한다. 예를 들어 스프링 시큐리티를 추가하면 보안기능이 바로 동작한다. 마찬가지로 MyBatis를 추가했다 → DB 연결이 필요하겠네. 연결하자 → 어 근데 설정이 없네 → 에러..