테이블
- 테이블은 실제로 데이터들이 저장되는 곳
- 테이블은 데이터베이스의 기본적인 데이터 저장 단위이다.
엔티티 = 개체
테이블 명명법
※ 테이블 생성시 제한사항과 고려할점
- 테이블 이름과 컬럼은 항상 알파벳 문자로 시작해야 하며 A~Z까지의 문자, 0~9까지의 숫자, 그리고 $,#,_(Under Bar)를 사용할 수 있다. (공백 사용 불가능)
테이블 생성 예제
-- emp2와 dept2테이블을 생성하는 예제이다.
SQL> CREATE TABLE EMP2(
EMPNO NUMBER CONSTRAINT emp_pk_empno PRIMARY KEY,
-- (컬럼) (데이터타입) (제약조건)
ENAME VARCHAR2(20),
JOB VARCHAR2(40),
MGR NUMBER,
HIREDATE DATE,
SAL NUMBER,
COMM NUMBER,
DEPTNO NUMBER);
테이블이 생성되었습니다.
SQL> CREATE TABLE DEPT2(
DEPTNO NUMBER CONSTRAINT dept_pk_deptno PRIMARY KEY,
DNAME VARCHAR2(40),
LOC VARCHAR2(50)) ;
테이블이 생성되었습니다.
테이블 조회
-- USER_TABLES 데이터사전을 조회 하면 유저가 소유한 테이블을 확인 할 수 있다.
SQL>SELECT table_name FROM USER_TABLES;
-- test유저가 관리하는 테이블 정보
select * from tab -- 간략한 정보 출력
select * from user_tables -- 자세한 정보 출력
TABLE_NAME
------------
BONUS
CRETABLE
DEPT
DUMMY
EMP
EMP2
SALGRADE
테이블 제약조건(Constraint)
- 제약조건이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 여러 가지 규칙을 적용해 놓는거라 생각하면 된다. 간단하게 테이블안에서 테이터의 성격을 정의하는 것이 바로 제약조건 이다.
- 부적절하다는 의미는 국어 점수가 100점을 넘으면 안되는데 200점이라는 데이터가 들어오는 경우
- 해당되는 범위를 벗어나는 부적절한 데이터를 방지하기 위해서 규칙을 적용하는 것이 제약조건이다. (데이터의 무결성)
- 남자 man male 남 성별적는칸에 이렇게 입력하는 경우 뜻은 전부 남자인데, 규칙이 없다. 조회할 때 이것이 문제가 된다.
남자라는 정보를 조회할 때 어떤 정보를 입력해서 조회할 것인지를 정해야 한다. 데이터에 대한 제약조건을 거는 것은 데이터에 대한 일관성을 만들어준다.
- 제약조건을 의미있는 이름을 부여하면 CONSTRAINT를 쉽게 참조해서 오류를 찾을 수 있다.
NOT NULL 조건
컬럼을 필수 필드화 시킬 때 사용 한다. (테이블안에 기입할 때 콤마 잘 확인하자)
[제약조건]
: 데이터의 무결성(Data Integrity)을 지키기 위한 설정
1. null(값이 없는 상태) / not null(필수입력)
create table tb1
(
-- [컬럼] [자료형] [제약조건]
name varchar2(100) not null, -- 회원가입시에 이름은 필수이기에 not null을 넣어준다.
addr varchar2(100) null, -- 필수 입력받지 않아도 되면 null
email varchar2(100), -- 아무런 값도 넣지 않으면 기본적으로 default 값이 null로 들어간다.
)
insert into tb1 values('일길동','서울시 관악구','abc123@google.net');
insert into tb1(name) values('이길동');
insert into tb1 values('삼길동',null,null);
select * from tb1 -- 입력한 데이터 조회
: table 내에서 inline방식만 허용된다
다른 제약조건은 다른 곳에서 제약을 걸 수 있는데, null 값은 내부에서만 이뤄져야한다.
-- error
insert into tb1(addr,email) valuse('서울','a@b.com');
UNIQUE 조건
데이터의 유일성을 보장(중복되는 데이터가 존재할수 없다) 되고, 자동으로 인덱스가 생성 된다.
2. unique제약 : 도메인내에 중복값 허용안함(유일한 값)
도메인 : 필드의 집합(해당하는 열로 모인 데이터)
create table tb2
(
name varchar2(100) not null,
id varchar2(100) unique not null
)
insert into tb2 values('일길동','one');
insert into tb2 values('원길동','one');
select * from tb2 -- 입력한 데이터 조회
create table tb22
(
name varchar2(100) not null,
id varchar2(100)
)
-- 제약조건을 등록
alter table tb22
add constraint unique_tb22_id unique(id);
-- (제약조건명)
insert into tb22 values('일길동','one');
insert into tb22 values('원길동','one');
select * from tb22 -- 입력한 데이터 조회
-- 제약조건부여방법3
create table tb222
(
name varchar2(100) not null,
id varchar2(100),
-- 제약조건작성
constraint unique_tb222_id unique(id)
)
CHECK 조건
컬럼의 값을 어떤 특정 범위로 제한할 수 있다.
3. check제약 : 필드내의 유효성(범위/값) 검증
cf)연산자
산술 : + - * / mod(피젯수,젯수)
select 1+1, 3-1, 2*3, 10/3, mod(10,3) from dual
관계 : > >= < <= =(같냐) !=(같지않냐) <>(같지않냐)
논리 : and <- A and B
or <- A or B
not <- not true
기타 : 필드 between A and B <- A <= 필드 <= B(A~B 사이냐?)
필드 in(A,B,C) <- 필드=A or 필드=B or 필드=C
- 점수에 관련된 예시 (점수는 0점~100점 사이에 있어야 한다)
create table tb3
(
name varchar2(100) not null,
kor int,
eng int,
math int
)
-- 국어점수 제약 등록
alter table tb3
add constraint ck_tb3_kor check(kor>=0 and kor<=100);
-- (제약조건명) check(조건)
-- 영어점수 제약 등록
alter table tb3
add constraint ck_tb3_eng check(eng between 0 and 100);
-- 수학점수 제약 등록
alter table tb3
add constraint ck_tb3_math check(math between 0 and 100);
insert into tb3 values('차선일',100,100,100);
select * from tb3
-- error kor
-- ORA-02290: 체크 제약조건(TEST.CK_TB3_KOR)이 위배되었습니다
insert into tb3 values('김국어',101,88,99);
-- error eng
-- ORA-02290: 체크 제약조건(TEST.CK_TB3_ENG)이 위배되었습니다
insert into tb3 values('삼영어',100,-88,100);
-- error math
-- ORA-02290: 체크 제약조건(TEST.CK_TB3_MATH)이 위배되었습니다
insert into tb3 values('백수학',100,88,200);
-- 제약 조건 삭제
alter table tb3
drop constraint ck_tb3_kor;
-- 제약 조건 수정
alter table tb3
add constraint ck_tb3_kor check(kor>=0 and kor<=101);
-- 아래 insert문 정상 작동
insert into tb3 values('김국어',101,88,99);
- 성별에 대한 제약조건 걸기(남자 or 여자)
-- 성별에 대한 제약설정('남자' 또는 '여자')
create table tb33
(
name varchar2(100) not null,
gender varchar2(100)
)
alter table tb33
add constraint ck_tb33_gender check(gender='남자' or gender='여자');
alter table tb33
add constraint ck_tb33_gender check(gender in('남자','여자'));
insert into tb33 values('일길동','남자');
insert into tb33 values('박길동','man'); -- error
select * from user_constraints -- 들어온 제약조건 확인
DEFAULT(컬럼 기본값) 지정
데이터를 입력 하지 않아도 지정된 값이 기본으로 입력 된다.
4. default 제약 : 값을 입력하지 않으면 default 값으로 들어간다.
create table tb4
(
name varchar2(100) not null,
gender varchar2(10) default '남자',
regdate date default sysdate -- sysdate 현재시간 출력
)
insert into tb4 values('이미자','여자',sysdate);
insert into tb4(name) values('박미자');
select * from tb4
PRIMARY KEY 지정
- 기본키는 UNIQUE 와 NOT NULL의 결합과 같다.
- 기본키는 그 데이터 행을 대표하는 컬럼으로서의 역할을 수행하여 다른 테이블에서 외래키들이 참조할 수 있는 키로서의 자격을 가지고 있다. 이를 참조 무결성이라 한다.
- UNIQUE 조건과 마찬가지로 기본키를 정의하면 자동으로 인덱스를 생성하며, 그 이름은 기본 키 제약 조건의 이름과 같다.
- primary key는 중복해서 생성할 수 없다.
- INDEX: 검색 키로서 검색 속도를 향상 시킨다.(UNIQUE,PRIMARY KEY 생성시 자동적으로 생긴다.)
5. primary key(기본키)
1) 레코드를 대표하는 대표키(행을 구분할 용도)
2) unique(index 설정) + not null
index(해당필드의 검색트리 생성) : 검색성능이 향상
3) 2개 이상의 컬럼을 묶어서 사용할 수 있다.
create table tb5
(
idx int,
name varchar2(100) not null
)
-- primary key 등록
alter table tb5
add constraint pk_tb5_idx primary key(idx);
-- 정상출력
insert into tb5 values(1,'일길동');
-- error : ORA-01400: NULL을 ("TEST"."TB5"."IDX") 안에 삽입할 수 없습니다
insert into tb5 values(null,'널길동');
-- error : ORA-00001: 무결성 제약 조건(TEST.PK_TB5_IDX)에 위배됩니다
insert into tb5 values(1,'하나길동');
- 시퀀스는 insert가 될 때 마다 값 자체를 추가 해줘서 이렇게 unique로 지정해놓은 값이 중복될 일이 없다.
FOREIGN KEY(외래 키)지정
- 기본키를 참조하는 컬럼 또는 컬럼들의 집합이다.
- 외래키를 가지는 컬럼의 데이터 형은 외래키가 참조하는 기본키의 컬럼과 데이터형과 일치해야 한다. 이를 어기면 참조무결성 제약에의해 테이블을 생성할수 없다.
- 외래키에 의해 참조되고 있는 기본 키는 삭제 할 수 없다.
- ON DELETE CASCADE 연산자와 함께 정의된 외래키의 데이터는 그 기본키가 삭제 될 때 같이 삭제 된다.
- 아래의 표와 같이 중복데이터0발생을 방지하기 위해서 테이블분리를 했다.
- 테이블분리를 통해서 학번(PK)을 Parent키로 설정해놓고 (Primary Key) 학번(FK) (Foreign key)를 연결시켜서 관계선을 만들어서, 부모키의 학번을 Foreign key가 참조해서 사용한다.
6. foreign key(외래키)
: 참조값이 외래테이블의 부모키를 참조한다.
참조할 수 있는 부모키의 조건은 (unique)이어야 한다.
create table 학생들
(
학번 int,
이름 varchar2(100) not null,
전화 varchar2(100) not null,
보호자명 varchar2(100) not null,
보호자직업 varchar2(100) not null,
주소 varchar2(100) not null
)
alter table 학생들
add constraint pk_학생들_학번 primary key(학번);
insert into 학생들 values(1,'일길동','111-1111','일아비','자영업','서울');
insert into 학생들 values(2,'이길동','222-2222','이아비','회사원','경기도');
select * from 학생들
create table 성적2
(
일련번호 int,
학번 int,
국어 int default 0,
영어 int default 0,
수학 int default 0,
학년 int,
학기 int,
시험종류 varchar2(100)
)
-- 기본키
alter table 성적2
add constraint pk_성적2_일련번호 primary key(일련번호);
-- 외래키
alter table 성적2
add constraint fk_성적2_학번 foreign key(학번)
references 학생(학번) -- 학생의 학번을 참조해준다.(부모키 설정)
--on delete casecade : 부모키 삭제시 자식도 삭제
--on update casecade : 부모키 수정시 자식도 수정
insert into 성적2 values(1,1,100,100,100,1,1,'중간고사');
insert into 성적2 values(2,1,100,100,100,1,1,'기말고사');
-- error : ORA-02291: 무결성 제약조건(TEST.FK_성적2_학번)이 위배되었습니다- 부모 키가 없습니다
insert into 성적2 values(3,3,100,100,100,1,1,'기말고사');
select * from 성적
제약 조건의 확인
- USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건 조회.
- USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건 조회.
-- 사용자 객체를 관리하는 테이블(Dictionary Table)
: user_tables / user_constraints / ...
select * from user_constraints
create table company
(
c_idx int not null,
c_name varchar2(100) not null,
c_ceo_name varchar2(100) not null,
c_addr varchar2(200),
c_tel varchar2(100),
c_type varchar2(100)
)
create table product
(
p_idx int not null,
p_model_num varchar2(100) unique not null,
p_name varchar2(100) not null,
p_price int,
c_idx int
)
alter table company
add constraint pk_c_idx primary key(c_idx);
alter table company
add constraint ck_c_type check(c_type in('코스피','코스닥'));
alter table product
add constraint pk_p_idx primary key(p_idx);
alter table product
add constraint ck_p_price check(p_price between 0 and 100000000);
alter table product
add constraint fk_c_idx foreign key(c_idx)
references company(c_idx);
insert into company values(1,'삼성','이재용','삼성동','010-1234-1234','코스피');
insert into company values(2,'LG','박장환','목동','010-7566-0000','코스피');
insert into company values(3,'SONY','김찬정','판교','010-1111-1234','코스피');
insert into product values(1,'358-189-18189','코털제거기','500000','2');
insert into product values(2,'453-801-45604','트렘펄린','150000','3');
insert into product values(3,'508-150-83695','LG그램','1500000','2');
insert into product values(4,'105-357-93127','김장용배추','35000','1');
insert into product values(5,'185-075-65600','드럼세탁기','1000000','3');
insert into product values(6,'905-365-15043','토레타제조기','300000','1');
select * from company;
select * from product;
'데이터베이스↗' 카테고리의 다른 글
데이터베이스 뷰 View (0) | 2024.05.23 |
---|---|
데이터베이스 함수(각 타입별 함수, case) (0) | 2024.05.23 |
데이터베이스 타입 변환 (0) | 2024.05.22 |
데이터베이스 데이터조작어(DML) (1) | 2024.05.22 |
데이터베이스 (튜토리얼) (0) | 2024.05.20 |