create table Dept(
id tinyint unsigned not null auto_increment,
pid tinyint unsigned not null default 0 commnet '상위부서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, -- 급여는 널값이 없고 default값을 0으로 해준다.
primary key(id),
foreign key(dept) references Dept(id)
);
insert into Dept(pid, dname) values (0, '영업부'), (0, '개발부') ,(1, '영업1팀'), (1,'영업2팀'), (1,'영업3팀'), (2, '서버팀'), (2, '클라이언트팀');
select d1.dname as '상위부서' ,d2.*
from Dept d1 inner join Dept d2 on d1.id = d2.pid;
위 코드의 결과는 아래와 같다.
-매개변수명
로 시작하게 만든다.v_ret
과 같이 중간에 _
를 사용하자.글자수 return하기
select char_length('한글abc');
함수를 만들다가 오류가 발생했는데 다음과 같은 쿼리를 작성하니 해결이 되었다.
SET GLOBAL log_bin_trust_function_creators = 1;
랜덤함수를 만들어 보자
CREATE DEFINER=`root`@`localhost` FUNCTION `f_rand1`(_str varchar(255)) RETURNS varchar(31) CHARSET utf8mb4
BEGIN
declare v_ret varchar(31);
declare v_len tinyint;
set v_len = char_length(_str);
set v_ret = substring(_str, CEIL(rand()* v_len), 1);
RETURN 1;
END
CREATE DEFINER=`mydeal`@`%` FUNCTION `f_rand1`(_str varchar(255)) RETURNS varchar(31) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
BEGIN
declare v_ret varchar(31);
declare v_len tinyint;
set v_len = char_length(_str);
set v_ret = substring(_str, CEIL(rand() * v_len), 1);
RETURN v_ret;
END
결과
위의 내용이 조금은 익숙해져서 쉽게 다가온다.
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
잘 작동하는지 확인해 보자.
select f_randname();
랜덤한 이름이 생성되는 것을 알 수 있다.
insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
insert into Emp(ename, dept, salary) values (f_randname(), f_rand1('34567'), f_rand1('123456789') * 100);
랜덤한 값들이 저장이 된다!
CREATE DEFINER=`root`@`localhost` 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