데이터베이스론 [4] solo실습1

1. 테이블 생성

create table Dept (
 id tinyint unsigned not null auto_increment,
 pid tinyint unsigned not null default 0 comment '상위부서id',
 dname varchar(31) not null,
 PRIMARY KEY (id)
);

create table Emp(
 id int unsigned not null auto_increment,
 ename varchar(31) not null,
 dept tinyint unsigned not null,
 salary int not null default 0,
 primary key(id),
 foreign key(dept) references Dept(id)
);
  • 이렇게 두 개의 테이블을 생성하였다.

2. INSERT로 정보 삽입

insert into Dept(pid, dname) values (0, '영업부'), (0, '개발부');

select * from Dept;

insert into Dept(pid, dname) 
values (1, '영업1팀'), 
(1, '영업2팀'), (1, '영업3팀'), 
(2, '서버팀'), (2, '클라이언트팀');
  • 처음에 데이터를 넣어주고, select 로 Dept의 모든 정보를 조회해서 잘 들어갔는지 확인 후, 나머지 값들을 다시 넣어주었다.

3. 문제 발생

insert into Dept(pid, dname) values (0, '영업부'), (0, '개발부');
  • 실수로 위 코드를 다시 실행해서 테이블에 똑같은 정보가 삽입되어버렸다.
  • 구글링을 해서 DELETE FROM Dept WHERE id = 8,9;를 했다가 id를 하나씩 입력했더니 코드가 실행이 되어서 다시 지워주었다.

4. 첫번째 function 생성할 때 문제 발생

  • SCHEMAS 에서 functions 를 클릭해서 처음에는 오타도 수정하고 하였는데 영상처럼 SQL script가 적용되지 않았다. 그래서 에러코드를 구글링을 해보았는데,
  • show global variables like 'log_bin_trust_function_creators'; 를 했을 때 값이 off면 안된다고해서 SET GLOBAL log_bin_trust_function_creators = 1; 로 on으로 재 설정을 해주었다. 그러다가 workbench 프로그램이 튕겨서 다시 들어갔는데, function에서 작성했던 코드가 사라졌다.
  • 그런데도 문법오류가 있다고 에러가 떠서 자세히 보니 function name을 백틱으로 감싸야하는데 작은 따옴표로 감싸고 있어서 apply가 되지 않았다.
  • 이렇게 에러를 해결하고
  • 적용에 성공하였다.

5. use a 'f_rand1' function

  • select f_rand1('김이박'); 을 해서 쿼리문을 실행시켜보면,
  • 이렇게 랜덤으로 김,이,박중 하나씩이 나왔다.
  • 따옴표 안에 '1234567'을 하면 1~7중 하나가 나왔다.

6. 두번째 function 생성

CREATE FUNCTION `f_randname` ()
RETURNS varchar(31)
BEGIN
  declare v_ret varchar(31);
  declare v_lasts varchar(255) default '김이박조최전천방지마유배원';
  declare v_firsts varchar(255) default '순신세종성호지혜가은세호윤국가나다라마바사아자차카결찬희'
  
  set v_ret = concat( f_rand1(v_lasts), f_rand1(v_firsts), f_rand1(v_firsts)

RETURN v_ret;
END
  • 이렇게 function을 작성하고 select f_randname(); 을 해보면 임의 이름이 출력된다.

Emp table에 직원정보 insert하기

    1. insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
    1. select * from Emp;
    • 이렇게 두 명의 가상 인물의 정보가 insert되었다.

위에서 만든 function을 반복하게 할 procedure만들기

  • 좌측에 Stored Procedures 우클릭해서 create들어가기
CREATE PROCEDURE `sp_test_emp` (_cnt int)
BEGIN
  declare v_idx int default 0;
  
  while v_idx < _cnt
  do 
    insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
  
  set v_idx = v_idx + 1;
  end while;
END
  • apply 한 후에 call sp_test_emp(10); 입력
  • select * from Emp; 입력 해보면
    • 기존에 2명을 넣은 것에 추가로 10명이 추가되어서 총 12명의 정보가 insert되었다.
      -call sp_test_emp(250); 을 입력해서 250명의 정보를 추가하였다.

부서별로 인원 분배하기

  • select dept, count(*) from Emp group by dept; 입력을 하였다

좋은 웹페이지 즐겨찾기