데이터베이스론 [5] H1 / 9.13 update

김병훈·2021년 9월 11일
0

데이터베이스론

목록 보기
6/11

에러를 해결한 이유에 대한 생각-> 키에 대한 이해가 더 필요하다.

Error Code: 1452. 
Cannot add or update a child row: a foreign key constraint fails 
(`byeonghun`.`emp`, CONSTRAINT `emp_ibfk_1` 
FOREIGN KEY (`deptid`) 
REFERENCES `dept` (`deptid`))
  • 가장 처음에 실습을 진행할 때 emp값을 넣었는데 위의 코드가 떠서 입력이 되지 않았었다. 그런데 오늘 책 앞쪽에서 dept에 먼저 데이터를 집어넣고 emp에 입력을 하니 제대로 삽입이 되었다. 그래서 키에 대한 문제인것 같아서 공부를 더 해야할 것 같다.

내가 생각한 것이 맞는 것 같다. 그림 1.14에서 기본키와 외래키에 대한 것이 나왔는데, FK 가 emp 에 있는 deptid이고, PK가 dept에 있는 deptid이기 떄문이다.
Pk: primary key, FK: foreign key

Q. 기본키와 외래키란?

A.

  • dept테이블, emp테이블을 먼저 생성해줬는데, 코드를 보면 emp테이블deptiddept 테이블deptid를 참조한다. 즉 외래키로 설정이 되어있다. 그래서 dept 테이블에 데이터를 먼저 insert해줘야 empdata를 넣을 때 참조를 할 수 있기 때문이다. dept table의 pk = dept id, emp table의 pk = empid

47페이지 7번 문제

  • 그림 1.13에 있는 동일한 튜플을 만들라는 문제를 풀어보려고 한다.
    • 먼저 deptemp 테이블을 생성하고(46페이지)
    • dept안에 insert로 값을 넣어주었다.
      예시코드 insert into dept values (400, '생산부', '500k');
    • emp 에 사원정보를 insert 하였다.
      예시코드 insert into emp values (1001, '홍성길', 100, '2001.2.1', '특수영업', 1002, 350);

코드수정

  • 근데 46p에 있는 코드에는 manager 가 없는데 문제에는 있어서 앞에서 만들 뷰랑 테이블을 모두 삭제하고 (drop table emp; , drop view new_emp;)
  • 다음과 같이 수정해서 다시 만들어 주었다.
CREATE TABLE emp
( empid int(10) NOT NULL,
  ename char(20),
  deptid int(5),
  hire_date date,
  job char(20),
  manager int(10),
  salary int(10) NOT NULL,
  PRIMARY KEY(empid),
  FOREIGN KEY (deptid) REFERENCES dept(deptid)
);

// 뷰

create view new_emp
  as select e.empid, e.ename, d.dname, e.salary
    from emp e, dept d
    where e.deptid = d.deptid ;
    

6번 문제 47p

  • 코드insert into emp (empid, ename, deptid, hire_date, job, salary) values (106, '강윤호', 200, '2001-01-10', '연말정산', 400);

8번 문제

  • 코드 select * from emp where job = '영업관리';

9번 문제

  • 이번엔 모든 정보가 아닌 사원의 이름 ename , 부서이름 jobselect 하려고 한다. 근데 추가적으로 급여 salary 가 400 이상인 조건이 존재한다.
  • 코드 select ename, job from emp where salary >= 400;

10번 문제

Q. 이번엔 dept에 있는 각 부서들에 속해 있는 사원들의 급여 합계를 보이라고 한다. 근데 emp에 아직 부서는 안 넣은 것 같은 생각이 들었다.

A. 틀렸다.

  • emp 에 도메인을 보니 deptid 가 이미 존재 하였다.
  • dept 테이블에도 deptid가 존재하였다.
  • 이것으로 인해서 왜 dept 테이블에 먼저 deptid를 넣어줘야지만 , emp에 data를 insert 할 수 있는지 깨달았다.
  • 코드 select SUM(salary) from emp where deptid = 100 and 300;
  • 맞는지 한번 emp table을 확인해보자
    • 영업부, 구매부에 속한 모든 사원들의 salary의 합
      • 영업부 : 350 + 450 = 750
      • 구매부 : 450
      • tot = 1200이 나와야하는데 100만 더해져서 750이 나왔다.

Update 9.13 월

  • OR 연산자를 사용하니 해결 되었다. 둘 다 100,300 일 수가 없고 100 또는 300인 경우에 더해야 하기 때문
select SUM(salary) from emp where deptid = 100 OR deptid = 300;

11번 문제

  • 처음에 select max(salary) , min(salary) from emp; 로 조회를 해봤다.
  • 그래서 select max(salary) - min(salary) from emp;
    를 하였더니 최댓값 최소값의 빼기 연산이 되서 150이 나왔다.

12번 문제

select emp.ename, emp.job, emp.salary
from emp
where salary >= 380 and emp.deptid = 100;

13번 문제

select dept.dname
from emp , dept
where emp.deptid = dept.deptid
and emp. ename = '성재규';

14번문제

// view 생성
create view H1_view
as select emp.empid, emp.ename, emp.deptid, emp.job, emp.salary
from emp, dept
where emp.deptid = dept.deptid;

// view 조회
SELECT * FROM H1_view;

problem

  • 구매부에 속한 사원들을 제외하고 만들어야 한다.

problem solving

  • 굳이 dept까지 값을 비교할 필요가 없고, 그냥 emp안에서만 하면 될거 같아서 vieww 를 새로 만들어 주었다.
    • 구매부 deptid = 300
// 새로운 view 생성

create view H1_vieww
as select empid, ename, deptid, job, salary
from emp
where deptid = 100 or deptid = 200 or deptid = 400;

// 새로운 뷰 조회
SELECT * FROM H1_vieww;

profile
블록체인 개발자의 꿈을 위하여

0개의 댓글