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하기
-
insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
-
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;
입력을 하였다