카테고리 없음

[수강일지 27] select 5 ( Table, constraint)

jamk-diary 2026. 6. 18. 09:27

table

/*
Table : colun(항목, 열), row(행)로 이루어져 있다 
데이터를 담을 수 있는 틀 
< data 자료형 > 
string       : varchar (byte) -> 한글자당 1바이트씩 들어간다 /   character varing
integer   :int, integer, numeric (자리수) -> ex)만 단위의 경우 5라고 적으면 된다  //numeric의 경우 오라클 가면 numberic이 된다
double, float   : numeric(정수의 자리수, 소수점) ->ex) 5.2 = 10000.12
calender   : date,tinestamp // 둘의 차이 : 날짜, 시간 +날짜 

<object 설정시 -> 
object : creat drop alter(tnwjd)           // (table, view)  //(table, view) -> (실제테이블, 가상테이블)
table 
view
sequence
--------------
<  date 설정>
insert delete select update


*/

table 추가 방법 


1. tool 사용하는 방법 
2. 쿼리문 사용하는 방법 : 사용률 높음 

tool을 사용해서 테이블 생성 

name :테이블명 
owner : 
scherma : 

+ 눌러서 컬럼 추가 
 
 
주의)  버챠 안 나옴 ch varing  으로 잡고 30 바이트로 자기 

 
 SQL  눌러서 확인하기 

ALTER TABLE IF EXISTS public.tb_test
    OWNER to postgres; -> alrer 를 수정해라 신경안써도 된다 
 

기본값

 
 

구현 확인

 
테이블 수정 원할 경우 

삭제 방법 
1. 구문 추가 , 테이블스 마우스 우클릭 -> 리프레쉬 
 

쿼리문 사용하기 
쿼리문으로 테이블 생성하는 법
CREATE table tb_test(
num int,  --qjsgh 
name varchar(30),
address varchar(45),
birth timestamp DEFAULT now()
);

> 구문 적은 후  tables 마우스 우클릭 -> refresh 누르면 테이블 목록에서 생성 확인 완료 

데이터 넣기 : INSERT

insert 형식 : insert into 테이블명 (칼럼명, ...)
values(값1, ...)

insert into tb_test(num,name,address,birth)
values (1,'홍길동', '부평구','2002-10-12');

insert into tb_test(num,name,address,birth)
values (2,'성춘향', '부평구',now());

insert into tb_test(num,name,address)
values (3,'일지매', '원주시');
데이터들이 정상적으로 입력되었음을 확인할 수 있다
insert into tb_test 
values (4,'홍두께', '인천시');

> 이렇게 적어도 테이블에 입력이 가능하다 
> 왜? 칼럼명은 생략이 가능하기 때문이다 

홍두께 입력 확인 완료

 
--에러에러 

insert into tb_test 
values ('홍두께',4, '인천시');

>왜? 칼럼명의 순서와 다르게 적었기 때문

 
-- >에러에러 해결방법 : 테이블 이름 옆에 칼럼의자료형의  순서대로 값을 순서대로 적어줄 것 

insert into tb_test 
values (4,'홍두께2 ', '인천시');
정삭작동 확인

 

insert into tb_test(address,birth,num,name)
values ('춘천시', '2000-08-23', 5,'이몽룡');

>--컬럼명을 바꾸어도 값만 제대로 적어준다면 에러 안 난다 

정상출력 확인

 

데이터 삭제 delete

delete 형식 
delete from 테이블명
 where 조건식
 

DELETE from tb_test
where num = 2;

>성춘향 지워보기

지워짐 확인 됨
DELETE from tb_test
where num = 4 and address = '인천시';

>num이 4 ,그리고 주소가 '인천시'인 사람 삭제하기 

 

수정하기:update

형식
UPDATE 테이블명 
SET 수정하고 싶은 값의 식 
where 조건식

UPDATE tb_test
set address = '남원시'
WHere name = '이몽룡';

>이몽룡 주소 남원시로 수정

 

데이터 한 번에 수정하기 : 여러 조건 넣을 수 있다 
UPDATE tb_test
set address = '인천시',birth = '2000-10-10'
WHere num = 1;
강사님 work 
-- 문제1) EMPLOYEES 테이블에서 부서별로 인원수,평균 급여,급여의 합,최소 급여,최대 급여를 포함하는 
-- EMP_DEPTNO 테이블을 생성하라.


-- 문제2) EMP_DEPTNO 테이블에 ETC COLUMN을 추가하라. 
-- 단 자료형은 VARCHAR(50) 사용하라.


-- 문제3) EMP_DEPTNO 테이블에 ETC COLUMN을 수정하라. 
-- 자료 형은 VARCHAR(15)로 하라.


-- 문제4) EMP_DEPTNO 테이블에 있는 ETC 을 삭제하고 확인하라.


-- 문제5) 위에 생성한 EMP_DEPTNO 테이블의 이름을 EMP_DEPT로 변경하라.


-- 문제6) EMP_DEPT 테이블을 삭제하라.


-- 문제7) EMPLOYEES 테이블을 EMP 테이블을 생성하고 복제하도록 하라.
-- (데이터 포함)
-- "사원번호", "이름", "월급", "부서번호", "부서명", "부서월급순위"   


-- 문제8) EMP 테이블에 row를 추가해 봅니다.
-- 다만, 반드시 데이터를 기입을 안해도 되면, NULL로 설정하도록 한다.


-- 문제9) EMPLOYEES 테이블에서 EMPNO, ENAME, SAL, HIREDATE, DEPARTMENT_ID의 COLUMN만 선택하여 
-- EMP_10 테이블을 생성(데이터 미포함)합시다.


-- 문제10) 50번 부서만 선택하여 이에 대응하는 값을 EMP_10 테이블에 추가하라.

⭕❌


-- 문제1) EMPLOYEES 테이블에서 부서별로 인원수,평균 급여,급여의 합,최소 급여,최대 급여를 포함하는 
-- EMP_DEPTNO 테이블을 생성하라.
CREATE TABLE EMP_DEPTNO
as
select  count(employee_id), avg(salary) as 평균급여, sum(salary)  as "급여의 합" , min(salary) as "최소 급여", max(salary)  as "최대 급여" 
from employees 
group by department_id;

select  * from EMP_DEPTNO;
)

-- 문제2) EMP_DEPTNO 테이블에 ETC COLUMN을 추가하라.
-- 단 자료형은 VARCHAR(50) 사용하라.

alter table EMP_DEPTNO
add COLUMN ETC_COLUMN VARCHAR(50);

select  * from EMP_DEPTNO;

-- 문제3) EMP_DEPTNO 테이블에 ETC COLUMN을 수정하라.
-- 자료 형은 VARCHAR(15)로 하라.
alter table EMP_DEPTNO
ALTER ETC_COLUMN
type VARCHAR(15);

select  * from EMP_DEPTNO;


-- 문제4) EMP_DEPTNO 테이블에 있는 ETC 을 삭제하고 확인하라.
ALTER TABLE emp_deptno
DROP COLUMN etc_column;

select  * from EMP_DEPTNO;

-- 문제5) 위에 생성한 EMP_DEPTNO 테이블의 이름을 EMP_DEPT2로 변경하라.

ALTER TABLE EMP_DEPTNO
RENAME to EMP_DEPT2;

-- 문제6) EMP_DEPT2 테이블을 삭제하라.

drop table EMP_DEPT2;

-- 문제7) EMPLOYEES 테이블을 EMP 테이블을 생성하고 복제하도록 하라.
-- (데이터 포함)
-- "사원번호", "이름", "월급", "부서번호", "부서명", "부서월급순위"   
CREATE table EMP
as
select *
from employees;

select  * from EMP;

-- 문제8) EMP 테이블에 row를 추가해 봅니다.
-- 다만, 반드시 데이터를 기입을 안해도 되면, NULL로 설정하도록 한다.
ALTER table emp
add row varchar null;

select  * from EMP;

-- 문제9) EMPLOYEES 테이블에서 EMPNO, ENAME, SAL, HIREDATE, DEPARTMENT_ID의 COLUMN만 선택하여 
-- EMP_10 테이블을 생성(데이터 미포함)합시다.
CREATE table EMP_10
as 
select employee_id as EMPNO, first_name as ENAME , salary as SAL , hire_date as HIREDATE ,department_ID as DEPARTMENT_ID
from employees
where 1=2;

select  * from EMP_10;

-- 문제10) 50번 부서만 선택하여 이에 대응하는 값을 EMP_10 테이블에 추가하라.
insert into EMP_10
VALUES (EMPNO, ENAME, SAL, HIREDATE, DEPARTMENT_ID)
as(select employee_id as EMPNO, first_name as ENAME , salary as SAL , hire_date as HIREDATE ,department_ID as DEPARTMENT_ID
from employees
where department_id =50 ));
 

무결성 constraint

/*
무결성 : constraint
-> 데이터가 원본 그대로 유지되는 것 

table -> colume의 특성(성질) : 값을 저장하는 규칙

check; 지정된 값, 범위의 값만을 사용할 수 있는 컬럼 

not null :빈칸을 허용하지 않는다 <- 무조건 값을 넣어라! 

primary key(pk)
: 기본키 -> null, 중복을 허용하지 않는다 
: id, 주민번호 등에 사용된다 

unique key(uk) 
: 고유키 -> 하나밖에 없는 값 , 중복을 허용하지 않는다, null 을 허용한다 
:email에 사용된다 

foreign key(fk)
: 외래키 -> 다른 테이블에서 기본, 고유키로 설정되어 있어야 사용이 가능하다 
 join 을 하기 위한 성질 
 null허용한다 ->허용하지 않도록 설정도 가능하다 
 


-- not null
drop table tb_test;

create table tb_test(
name varchar(30) not null,
height numeric(5, 1)
);

insert into tb_test(name, height)
values('홍길동', 172.1);

insert into tb_test(name)
values('성춘향');

insert into tb_test(height) -- 무결성 에러
values(153.2);

insert into tb_test(name, height) -- 빈문자도 된다
values('', 172.1);

insert into tb_test(name, height)
values('일지매', null);

insert into tb_test(name, height)
values('홍두께', '167.9'); -- 에러가 아니다

select * from tb_test;

-- check
create table tb_check(
fruit varchar(30),
num_cnt int,
constraint check1 check(fruit in('apple', 'pear', 'banana')),
constraint check2 check(num_cnt > 0 and num_cnt <= 10)
);

insert into tb_check(fruit, num_cnt)
values('apple', 3);

insert into tb_check(num_cnt)
values(6);

insert into tb_check(fruit)
values('banana');

insert into tb_check(fruit, num_cnt)
values('apple', null);

insert into tb_check(fruit, num_cnt)
values('grape', null); -- error

insert into tb_check(fruit, num_cnt)
values('pear', 12); -- error

select * from tb_check;

-- Primary Key = Unique Key + NOT NULL
drop table tb_test;

create table tb_test(
id varchar(30) primary key,
name varchar(30)
);

insert into tb_test(id, name)
values('abc', '홍길동');

insert into tb_test(name)  -- not null에 대한 에러
values('홍길동');

insert into tb_test(id)
values('abc'); -- 컬럼에 존재하는 값을 추가 error

insert into tb_test(id, name)
values('bcd', '홍길동');

select * from tb_test;

-- 제약조건과 같이 테이블을 삭제
drop table if exists tb_test;

create table tb_test(
id varchar(30),
name varchar(30)
);

-- Primary Key를 추가
alter table tb_test
add
primary key(name);

-- Primary Key를 삭제
alter table tb_test
drop 
constraint tb_test_pkey;

drop table if exists tb_test;

-- unique : 고유키  null은 OK, 중복X
create table tb_test(
email varchar(30) unique,
name varchar(30)
);

insert into tb_test(email, name)
values('abc@naver.com', '홍길동');

insert into tb_test(email)
values('bcd@naver.com');

insert into tb_test(name)
values('성춘향');  -- null은 허용

insert into tb_test(email)
values('bcd@naver.com');  -- 중복된 값 -> error

select * from tb_test;

-- 외래키
/*
foreign key : 목적 -> join

외래키로 설정되어 있는 컬럼은 
외부테이블에서 Primary Key나 Unique로 설정되어 있어야 한다
null을 허용

emp -> employees
dept -> departments
*/
drop table emp;

-- 부모테이블
create table dept(
department_id int primary key, -- 기본키
department_name varchar(30)
);

insert into dept(department_id, department_name)
values(10, '인사부');

insert into dept(department_id, department_name)
values(20, '개발부');

insert into dept(department_id, department_name)
values(30, '경리부');

select * from dept;

-- 자식테이블
create table emp(
employee_id int primary key,
first_name varchar(30),
department_id int,

foreign key(department_id) references dept(department_id)
);

insert into emp(employee_id, first_name, department_id)
values(1, '홍길동', 20);

insert into emp(employee_id, first_name, department_id)
values(2, '성춘향', 30);

insert into emp(employee_id, first_name, department_id)
values(3, '일지매', 40);   -- 40은 없음 error

insert into emp(employee_id, first_name)
values(4, '킴벌리');      -- 외래키는 null을 허용함!

select * from emp;

select e.employee_id, e.first_name, 
e.department_id, d.department_name
from emp e, dept d
where e.department_id = d.department_id;