728x90

if-then은 주로 단일 조건을 다루는 데 사용,

예를 들어, "만약 A라면 B를 실행하고, 그렇지 않으면 C를 실행" 하는 경우에 사용

 

case-when-then은 여러 조건을 처리하거나 여러 값을 반환해야 하는 경우에 사용, 여러 조건에 따라 다른 결과를 반환하는 복잡한 분기 처리에 유용

 

간단한 단일 조건을 다룰 때는 if-then을 사용하고, 여러 조건이나 값에 따라 다른 결과를 반환해야 할 때는 case-when-then을 사용하는 것이 좋다

If-then

use khw;

set @var1=10;
set @var2=20;

select @var1 from emp;
select @var1+@var2;

-- IF문 
delimiter //
create procedure pr1()
begin
	if 5=5 then
		select '5는 5와 같다';
	end if;
    end //
delimiter ;

call pr1();

delimiter //
create procedure pr2()
begin
	declare num int; -- 변수선언
    set num =100; -- 변수에 값 대입
    if num=100 then
		select '100이다';
    else
		select '100아니다';
    end if;
end //
delimiter ;
call pr2();    

Case-When-Then

-- case when then

delimiter //
create procedure pr3()
begin
	declare num int; -- 변수선언
    declare grade char(1); -- 변수선언
    set num=80; -- 값 대입
case 
	when num >= 90 then
		set grade = 'A';
	when num >= 80 then
		set grade = 'B';
	else
		set grade = 'F';
end case;
	select num,grade;
end //
delimiter ;

call pr3();

Set-While-do

delimiter //
create procedure pr4()
begin
	declare i int;
    declare sum int;
    set i=1;
    set sum=0;
    
    while(i<=10) do
		set sum=sum+i;
        set i=i+1;
    end while;
    
    select sum;
end //
delimiter ;
    
call pr4();
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] 커서(Cursor)  (0) 2024.03.20
[MySQL] 트리거(Trigger)  (0) 2024.03.20
[MySQL] 쿼리 종합예시  (0) 2024.03.19
[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] 뷰(View)  (0) 2024.03.18
728x90

구조

delimiter //
create procedure test10()
begin
	declare v_stu_no char(9);
   	declare v_sub_no char(3);
    declare v_enr_grade int;
    declare done int default 0;

declare endOfRow boolean default false; -- 행의 끝 여부

declare c1 cursor for select stu_no, sub_no, enr_grade from enrol where sub_no=104;

declare continue handler for not found set done=1;
-- 더 이상 읽을 행이 없으면 1

open c1;
li:loop
	fetch from c1 into v_stu_no, v_sub_no, v_enr_grade;
    if done then leave li;
    end if;
    select v_stu_no, v_sub_no, v_enr_grade;
    end loop;
    close c1;
end //
delimiter ;

call test10;
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] IF-Then/Case-when-then/Set-While-do  (0) 2024.03.21
[MySQL] 트리거(Trigger)  (0) 2024.03.20
[MySQL] 쿼리 종합예시  (0) 2024.03.19
[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] 뷰(View)  (0) 2024.03.18
728x90

트리거

  • 테이블에 DML문(Insert, Update, Delete 등) 이벤트가 발생될 때 작동
  • 직접 실행 불가 - 테이블에 이벤트 일어나야 자동 실행
  • IN, OUT 매개 변수를 사용핛 수 없음
  • MySQL은 View에 트리거 부착 불가!!!

 

예시) After 트리거

create table tmp_tbl(
userid varchar(10),
workdate date,
bigo char(1));

desc tmp_tbl;

delimiter //
create trigger tri1
after update
on student -- student테이블을 update한 이후,
for each row
begin
	insert into tmp_tbl values('aa',curdate(),'U');
end //
delimiter ;

update student set stu_weight = stu_weight-10;
delimiter //
create trigger tri5
after update
on student -- student 테이블에서 업데이트 일어난 후
for each row
begin
	if(old.stu_weight> 40.00) then
		insert into tmp_tbl values('aabb',curdate(),'A');
        end if;
end //
delimiter ;
delimiter //
create trigger tri5
after update
on student -- student 테이블에서 업데이트 일어난 후
for each row
begin
	if(old.stu_weight> 40.00) then
		insert into tmp_tbl values('aabb',curdate(),'A');
        end if;
end //
delimiter ;

update student set stu_name='김길동'
where stu_name='옥한빛';

commit;

 

 

사원테이블에 사원이 추가될 때 5000보다 급여가 많으면 emp500 테이블에 입력된 사원번호, 사원이름, 입력된 날짜를 입력하는 트리거 작성

-- 사원테이블에 사원이 추가될 때 5000보다 급여가 많으면 emp500 테이블에 입력된 사원번호, 사원이름, 입력된 날짜를 입력하는 트리거 작성
create table emp500(
empno int(4),
ename varchar(10),
workdate date);

delimiter //
create trigger tri6
after insert 
on emp
for each row
begin
   if new.sal > 5000 then
    insert into emp500 values(new.empno,new.ename,now());
    end if;
end //
delimiter ;

insert into emp 
values(1111,'gildong','student',7839,now(),5600,null,10);

insert into emp 
values(2222,'jack','student',7839,now(),4600,null,10);

select *from emp500;

 

 

After 트리거 - delete

부서테이블의 데이터 삭제 시 dept_Del 테이블에 삭제된 데이터를 저장하는 트리거를 작성

-- 부서테이블의 데이터 삭제 시 dept_Del 테이블에 삭제된 데이터를 저장하는 트리거를 작성

create table dept_del(
userid varchar(10),
workdate date,
deptno int(2),
dname varchar(14),
loc varchar(13));

delimiter //
create trigger tri7
after delete
on dept
for each row
begin
	insert into dept_del values('user',now(),old.deptno,old.dname,old.loc);
end //
delimiter ;

delete from dept where deptno=10;

select *from dept_del;

트리거 종합

-- 1. 상품 정보(product)테이블에 열 이름이 ‘비고’ 라는 열을 varchar(20)으로 삽입해라.
ALTER TABLE product ADD 비고 varchar(20) AFTER p_group;
-- 2. 1번에서 삽입한 열이 상품 정보(product)테이블에 삽입되었는지 확인해라.
select *from product;
-- 3. 상품 정보(product)테이블에 ‘비고’ 열의 구조를 char(3)으로 변경해라.
alter table product modify 비고 char(3);
-- 4. 상품코드 401에 대한 거래내역 뷰(v_trade)를 만들어라.
create view v_trade as select * from trade where p_code=401;
-- 5. 상품 정보(product)테이블에 가장 최근에 들어온 거래처 코드 정보를 검색해라(top-n질의)
select c.c_code from customer c, product p, trade t where p.p_code = t.p_code and c.c_code=t.c_code order by c.c_code desc limit 1; 
-- 6. 상품을 삽입하는 프로시저를 생성해라.
-- call p_pro(‘403’, ’7.1채널 스피커’, 180000, ‘스피커’);
delimiter //
create procedure p_pro
(in v_p_code char(3),
in v_p_name varchar(30),
in v_p_cost int,
in v_p_group varchar(30))
begin
insert into product(p_code, p_name, p_cost, p_group)
values(v_p_code, v_p_name, v_p_cost, v_p_group);
end //
delimiter ;	

call p_pro('403', '7.1채널 스피커', 180000, '스피커');

트리거종합 中 삭제

create table product_del
(u_id varchar(10),
wdate date,
p_code int(6),
p_name varchar(30),
p_cost int,
p_group varchar(30));

-- 상품 삭제 시(product테이블에서) product_del 테이블에 삽입이 이루어지는트리거를 작성해라.
-- p_code , p_name , p_cost , p_group은 기존 product테이블에 있는 값으로 삽입해라.

-- delete from product where p_code=’201’;

delimiter //
create trigger tri8
after delete
on product
for each row
begin
	insert into product_del values('usd',now(),old.p_code,old.p_name,old.p_cost,old.p_group);
    end //
    delimiter ;
    
delete from product where p_code='201';
select *from product_del;
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] IF-Then/Case-when-then/Set-While-do  (0) 2024.03.21
[MySQL] 커서(Cursor)  (0) 2024.03.20
[MySQL] 쿼리 종합예시  (0) 2024.03.19
[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] 뷰(View)  (0) 2024.03.18
728x90

create table book( bookid int primary key, bookname varchar(100), publisher varchar(100), price int);

create table orders( orderid int primary key, custid int, bookid int, saleprice int, orderdate date);

create table customer( custid int primary key, name varchar(100), address varchar(100), phone varchar(100));

alter table orders add constraint fk_bookid foreign key(bookid) references book(bookid);

alter table orders add constraint fk_custid foreign key(custid) references customer(custid);

 

 

INSERT INTO BOOK VALUES (1, '컴퓨터의 역사', '아이티', 7000);

INSERT INTO BOOK VALUES (2, '컴퓨터는 무엇일까', '굿북', 13000);

INSERT INTO BOOK VALUES (3, '컴퓨터의 이해', '비트아이티', 22000);

INSERT INTO BOOK VALUES (4, '자바 이론', '비트아이티', 35000);

INSERT INTO BOOK VALUES (5, '데이터베이스 교본', '아이티', 8000);

INSERT INTO BOOK VALUES (6, 'HTML 기술', '아이티', 6000);

INSERT INTO BOOK VALUES (7, '스프링의 개념', '에비씨미디어', 20000);

INSERT INTO BOOK VALUES (8, '스프링을 부탁해', '에비씨빛미디어', 13000);

INSERT INTO BOOK VALUES (9, '파이썬 이야기', '코딩빔', 7500);

INSERT INTO BOOK VALUES (10, 'python story', 'Pearson', 13000);

 

 

INSERT INTO CUSTOMER VALUES (1, '박건우', '인천시 송도', '010-1111-2222');

INSERT INTO CUSTOMER VALUES (2, '김선해', '서울시 종로구', '010-2111-2222');

INSERT INTO CUSTOMER VALUES (3, '장지혜', '서울시 용산구', '010-3111-2222');

INSERT INTO CUSTOMER VALUES (4, '추오섭', '경기도 의정부', '010-4111-2222');

INSERT INTO CUSTOMER VALUES (5, '박승철', '서울시 마포구', NULL);

 

 

INSERT INTO ORDERS VALUES (1, 1, 1, 6000, '2022-05-01');

INSERT INTO ORDERS VALUES (2, 1, 3, 21000, '2022-05-03');

INSERT INTO ORDERS VALUES (3, 2, 5, 8000, '2022-05-03');

INSERT INTO ORDERS VALUES (4, 3, 6, 6000, '2022-05-04');

INSERT INTO ORDERS VALUES (5, 4, 7, 20000, '2022-05-05');

INSERT INTO ORDERS VALUES (6, 1, 2, 12000, '2022-05-07');

INSERT INTO ORDERS VALUES (7, 4, 8, 13000, '2022-05-07');

INSERT INTO ORDERS VALUES (8, 3, 10, 12000, '2022-05-08');

INSERT INTO ORDERS VALUES (9, 2, 10, 7000, '2022-05-09');

INSERT INTO ORDERS VALUES (10, 3, 8, 13000, '2022-05-10');

 

 

-- 1. 김선해 고객의 전화번호를 찾아라.
select phone from customer where name='김선해';

-- 2. 모든 도서의 이름과 가격을 검색해라.
select bookname, price from book;

-- 3. 모든 도서의 도서번호, 도서이름, 출판사, 가격을 검색해라.
select * from book;

-- 4. 도서 테이블에 있느느 모든 출판사를 검색해라. (중복제거해서)
select distinct(publisher) from book;

-- 5. 가격이 20000원 미만인 도서를 검색해라.
select bookid, bookname from book where price<20000;

-- 6. 가격이 10000원 이상 20000 이하인 도서를 검색해라.
select bookid, bookname from book where price between 10000 and 20000;

-- 7. 출판사가 ‘아이티’ 혹은 ‘비트아이티’ 인 도서를 검색해라.
select bookid, bookname from book where publisher in('아이티','비트아이티');

-- 8. 출판사가 ‘아이티’ 혹은 ‘비트아이티’ 아닌 도서를 검색해라.
select bookid, bookname from book where publisher not in('아이티','비트아이티');

-- 9. ‘컴퓨터의 역사’를 출간한 출판사를 검색해라.
select publisher from book where bookname='컴퓨터의 역사';

-- 10. 도서이름에 ‘컴퓨터’가 포함된 출판사를 검색해라.
select publisher from book where bookname like'%컴퓨터%';

-- 11. 도서이름의 왼쪽 두번 째에 ‘퓨’라는 문자열을 갖는 도서를 검색해라.
select bookid, bookname from book where bookname like'_퓨%';

-- 12. 컴퓨터에 관한 도서 중 가격이 20000원 이상인 도서를 검색해라.
select bookid, bookname from book where bookname like'%컴퓨터%' and price>=20000;

-- 13. 도서를 이름순으로 검색해라.
select *from book order by bookname;

-- 14. 도서를 가격순으로 검색하고, 가격이 같으면 이름순으로 검색해라.
select *from book order by price, bookname;

-- 15. 도서를 가격의 내림차순으로 검색해라. 가격이 같다면 출판사의 오름차순으로 검색해라.
select from book order by price desc, publisher;

-- 16. 고객이 주문한 도서의 총 판매액을 구해라.
select sum(saleprice) from orders;

-- 17. 2번 김선해 고객이 주문한 도서의 총 판매액을 구해라.
select sum(saleprice) from orders where custid=2;

-- 18. 고객이 주문한 도서의 총 판매액, 평균값, 최저가, 최고가를 구해라.
select sum(saleprice),avg(saleprice),min(saleprice),max(saleprice) from orders;

-- 19. 23서점의 도서 판매 건수를 구해라.
select count() from orders;

-- 20. 고객별로 주문한 도서의 총 수량과 총 판매액을 구해라.
select name, count(o.custid), sum(saleprice) from orders o, customer c where o.custid = c.custid group by name;

-- 21. 가격이 8000원 이상인 도서를 구매한 고객에 대하여 고객별 주문 도서의 총 수량을 구해라. 단, 두 권 이상 구매한 고객만 구해라.
select name, c.custid, count(*) as totalbuying from orders o, customer c where o.custid = c.custid and saleprice>=8000 group by custid having count(*)>=2;
----------------------------------------------
SELECT
custid, COUNT(*) AS BUY
FROM
(SELECT
ord.custid,
ord.bookid,
ord.saleprice,
bk.bookname,
bk.price,
cust.name
FROM
orders ord, book bk, customer cust
WHERE
ord.bookid = bk.bookid
AND ord.custid = cust.custid
AND bk.price >= 8000) AA
GROUP BY custid
HAVING COUNT(*) >= 2;
-- 22. 고객과 고객의 주문에 관한 데이터를 모두 보여라.
select *from customer c, orders o where c.custid=o.custid;

-- 23. 고객과 고객의 주문에 관한 데이터를 고객번호 순으로 정렬하여 보여라.
select *from customer c, orders o where c.custid=o.custid order by c.custid;

-- 24. 고객의 이름과 고객이 주문한 도서의 판매가격을 검색해라.
select name, saleprice from customer c , orders o where c.custid=o.custid;

-- 25. 고객별로 주문한 모든 도서의 총 판매액을 구하고, 고객별로 정렬해라.
select c.custid, name, sum(saleprice) from customer c , orders o where c.custid=o.custid group by c.custid order by c.custid;

-- 26. 고객의 이름과 고객이 주문한 도서의 이름을 구해라.
select name, bookname, b.bookid from orders o, customer c, book b where c.custid=o.custid and o.bookid=b.bookid;

-- 27. 가격이 20000원인 도서를 주문한 고객의 이름과 도서의 이름을 구해라.
select name, bookname from orders o, customer c, book b where c.custid=o.custid and o.bookid=b.bookid and price=20000;

-- 28. 도서를 구매하지 않은 고객을 포함하여 고객의 이름과 고객이 주문한 도서의 판매가격을 구해라.
select [c.name](<http://c.name/>), o.saleprice, c.custid, b.price from customer c left outer join orders o on c.custid=o.custid left outer join book b on o.bookid=b.bookid;

-- 29. 가장 비싼 도서의 이름을 구해라.
select bookname, price from book where price=(select max(price) from book);

-- 30. 도서를 구매한 적이 있는 고객의 이름을 검색해라.
select distinct(name) from orders o, customer c where c.custid=o.custid;

-- 31. 비트아이티에서 출판한 도서를 구매한 고객의 이름을 보여라.
select name,bookname,publisher from book b, customer c, orders o where c.custid=o.custid and b.bookid=o.bookid and publisher='비트아이티';

-- 32. 출판사별로 출판사의 평균 도서 가격보다 비싼 도서를 구해라.
select bookname, price from book where avg(price) group by publisher;
--------------------------------------------------------------------------------
select b.bookname, b.price, b_avg.publisher, b_avg.avg_price from book b,
(select publisher, avg(price) as avg_price from book
group by publisher) b_avg
where b.publisher=b_avg.publisher
and b.price > b_avg.avg_price;

-- 33. Book테이블에 새로운 도서 ‘공학 도서’를 삽입해라. 공학 도서는 더샘에서 출간했으며 가격을 40000원이다.
insert into book values(11,'공학 도서','더샘',40000);

-- 34. Book테이블에 새로운 도서 ‘공학 도서’를 삽입해라. 공학 도서는 더샘에서 출간했으며 가격은 미정이다.
insert into book values(12,'공학 도서','더샘',null);

-- 35. Customer테이블에서 고객번호가 5인 고객의 주소를 ‘서울시 서초구’로 변경해라.
update customer set address='서울시 서초구' where custid=5;

-- 36. Customer테이블에서 박승철 고객의 주소를 김선해 고객의 주소로 변경해라.
update customer set address='서울시 종로구' where name='박승철';
--------------------------------------------------------------------
update customer as cust
join customer as cust2 on cust2.name='김선해'
set cust.address=cust2.address
where cust.name='박승철';

-- 37. 아이티에서 출판한 도서의 제목과 제목의 글자수를 확인해라.
select bookname, char_length(bookname) from book where publisher='아이티';

-- 38. 23서점의 고객 중에서 같은 성(이름 성)을 가진 사람이 몇 명이나 되는지 성별 인원수를 구해라.
select substr(name, 1,1),count(*) from customer group by substr(name,1,1);
-----------------------------------------------------------------------------------------------------
select Familyname, count(*) from (select substr(name,1,1) as Familyname from customer) A group by Familyname;

-- 39. 23서점은 주문일로부터 10일 후 매출을 확정한다. 각 주문의 확정일자를 구해라.
select orderdate, date_add(orderdate, interval 10 day) as'확정일자' from orders ;
-----------------------------------------------------------------------------------------
select orderdate, (orderdate+10)as confirmdate from orders;

-- 40. 23서점이 2022년 5월 7일에 주문받은 도서의 주문번호, 주문일, 고객번호, 도서번호를 모두 보여라. 주문일은 ‘yyyy-mm-dd요일’형태로 표시한다.
select orderid, orderdate, custid, bookid from orders where orderdate='2022-05-07';
------------------------------------------------------------------------------------------
select orderid, date_format(orderdate, '%y-%m-%d-%w요일'), custid, bookid from orders where orderdate='2022-05-07';

-- 41. 이름, 전화번호가 포함된 고객목록을 보여라. 단, 전화번호가 없는 고객은 ‘연락처없음’으로 표시해라.
select name, ifnull(phone,'연락처없음') from customer;

-- 42. 평균 주문금액 이하의 주문에 대해 주문번호와 금액을 보여라.
select orderid, saleprice from orders where saleprice<=(select avg(saleprice)from orders);

-- 43. 각 고객의 평균 주문금액보다 큰 금액의 주문 내역에 대해 주문번호, 고객번호, 금액을 보여라.
select orderid, custid, saleprice from orders where saleprice > all(select avg(saleprice)from orders group by custid);

-- 44. 서울시에 거주하는 고객에게 판매한 도서의 총판매액을 구해라.
select sum(saleprice) from orders o, customer c where o.custid=c.custid and address like '서울%';
----------------------------------------------------------------------------------------------------------------
select sum(saleprice) from orders where custid in(select custid from customer where address like '서울%');

-- 45. Customer테이블에서 고객번호가 5인 고객을 삭제해라.
delete from customer where custid=5;
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] 커서(Cursor)  (0) 2024.03.20
[MySQL] 트리거(Trigger)  (0) 2024.03.20
[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] 뷰(View)  (0) 2024.03.18
[MySQL] Top N 질의문  (0) 2024.03.18
728x90

저장 프로시저 라고도 불림

쿼리문의 집합으로 어떠한 동작을 일괄 처리하기 위한 용도로 사용

쿼리 모듈화

  • 필요할 때마다 호출만 하면 훨씬 편리하게 My SQL 운영
  • CALL 프로시저_이름() 한 줄로 해결되는 편리함

 

특징

  • MySQL의 성능향상
    • 긴쿼리가 아니라 짧은 프로시저 내용만 클라이언트에서 서버로 전송
  • 유지관리가 간편
    • 응용 프로그램에서는 프로시저만 호출

 

형식

delimiter //
create procedure 스토어드 프로시저이름(in or  파라미터)
begin
	update 
    set 
    where 
end // 
delimiter ;

call 스토어드 프로시저 이름;

 

 

예시) 학번이 같을 때 학년이 변경되는 프로시저

delimiter //
create procedure test1(in v_stu_no int,
						in v_stu_grade char(1))
begin
	update student 
    set stu_grade=v_stu_grade
    where stu_no=v_stu_no;
end // 
delimiter ;

call test1(20153075,3);

 

 

예시) 학번을 입력하여 이름을 출력하는 프로시저

delimiter //
create procedure test2(in v_stu_no int,
						out v_stu_name varchar(12))
begin
	select stu_name
    into v_stu_name
    from student
    where stu_no=v_stu_no;
    
end //
delimiter ;

call test2(20153075, @d_stu_name);
select @d_stu_name;
------
옥한빛 출력됨

 

 

예시3)학생의 점수를 임의 점수를 올리고(학번, 과목번호가 일치하면 그 결과를 출력하는 프로시저)

-- 학생의 점수를 임의 점수를 올리고(학번, 과목번호가 일치하면 그 결과를 출력하는 프로시저)

delimiter //
create procedure test3(in v_sub_no char(3),
					   in v_stu_no char(9),
					   inout v_enr_grade int)
begin
 -- 성적을 올리겠다!(학번과 과목이 같다면!)
	update enrol
    set enr_grade=enr_grade+v_enr_grade
    where stu_no=v_stu_no and sub_no=v_sub_no;
    
 -- 학번 과목 같으면 증가시킨 성적을 v_enr_grade에 저장하겠다!
    select enr_grade
    into v_enr_grade from enrol
    where stu_no=v_stu_no and sub_no=v_sub_no;
end //
	delimiter ;
	
set @d_enr_grade=10;

call test3(102, 20153075, @d_enr_grade);

select @d_enr_grade;

-- @d_enr_grade 76 출력됨

 

 

프로시저 삭제)

drop procedure 프로시저 이름;

 

 

 

예시)

신입사원을 채용하였다.

사원번호, 사원이름, 사원직무, 상급자사원번호, 급여, 부서번호를 입력받아 사원 테이블에 삽입하는 프로시저를 작성해라.

delimiter //
create procedure test4
(in v_empno int,
in v_ename varchar(10),
in v_job varchar(9),
in v_mgr int,
in v_sal decimal(7,2),
in v_deptno int)
begin
	insert into emp(empno, ename, job, mgr, sal, deptno)
	values(v_empno, v_ename, v_job, v_mgr, v_sal, v_deptno);
end //
delimiter ;

call test4(7882,'엄마손','대리',7902,7000,20);

 

 

스토어드 함수 생성권한 사용

set global log_bin_trust_function_creators=1;

 

 

예시)

set global log_bin_trust_function_creators=1;

delimiter //
create function test5(v_enr_grade int)
      returns char
begin
   declare enr_score char; -- 변수 선언
    if v_enr_grade >=90 then set enr_score:='A'; -- : 대입연산자
    elseif v_enr_grade >=80 then set enr_score:='B';
    elseif v_enr_grade >=70 then set enr_score:='C';
    elseif v_enr_grade >=60 then set enr_score:='D';
    else set enr_score:='F';
    end if;
    return enr_score;
end //
delimiter ;

select test5(95);

 

 

예시) 급여가 제일 높은 사원이름 출력

set global log_bin_trust_function_creators=1;

delimiter // 
create function test6()
	returns varchar(50) -- 반환유형을 varchar
begin
	declare v_ename varchar(50);
	select ename into v_ename
    from emp
    where sal=(select max(sal) from emp);
    return v_ename;
end //
delimiter ;

select distinct test6() from emp;

 

 

프로시저 삭제

예시)

-- emp 테이블의 모든 데이터를 삭제시키는 프로시저 작성(all_del)
delimiter //
create procedure all_del()
begin
	delete from emp2;
end //
delimiter ;

call all_del();

 

삭제된 데이터 다시

-- 삭제한 데이터를 다시 값 삽입
insert into emp2 select *from emp;

 

 

프로시저 조건삭제

예시)

-- 이름에 'M'이 들어간 사원들을 다 삭제하는 프로시저(del_name)
delimiter //
create procedure del_name()
begin
	delete from emp2 where ename like '%M%';
end //
delimiter ;

call del_name();

 

 

 

Stored function(스토어드 함수)

-- 스토어드 프로시저 -- 저장 프로시저(Stored procedure)
-- 스토어드 함수 -- 저장 함수 (Stored function)
delimiter //
create function addin(n1 int, n2 int)
	returns int
begin
	return n1+n2;
end //
delimiter ;

select addin(4,5) as '두 수의 합';
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] 트리거(Trigger)  (0) 2024.03.20
[MySQL] 쿼리 종합예시  (0) 2024.03.19
[MySQL] 뷰(View)  (0) 2024.03.18
[MySQL] Top N 질의문  (0) 2024.03.18
[MySQL] Join  (0) 2024.03.18
728x90

가상 테이블

 

특징

  • WHERE, SUB QUERY, UNION, JOIN 등 다양한 결합과 조건으로 만들어진 데이터를 뷰를 통해 가상 테이블을 만들어 편리하고 빠르게 데이터를 조회
  • 저장장치 내에서 물리적으로 존재하지 않음
  • 사용자에게는 있는 것처럼 간주된다

장점

  1. 특정 사용자에게 테이블 전체가 아닌 필요한 필드만을 출력이 가능
  2. 복잡한 쿼리를 단순화해서 사용가능
  3. 쿼리 재사용 가능

단점

  1. 한 번 정의된 뷰는 변경불가
  2. 삽입, 삭제, 갱신 작업에 많은 제한 사항을 가진다
  3. 자신만의 인덱스를 가질 수 없다

구성)

create view viewname as select~ from~ where~;

 

 

뷰 생성

-- 뷰 생성(임시적인 사용)
create view v_student1
as select *from student where stu_dept='컴퓨터정보';

 

 

뷰 조인

create view v_enrol1
as select b.sub_name, a.sub_no, stu_no, enr_grade
from enrol a, subject b where a.sub_no=b.sub_no;

 

 

예시)

-- 사원테이블로부터 20번 부서의 사원들로 이루어져 있는 뷰를 생성(v_emp20)
create view v_emp20
as select *from
 emp where deptno=20;
-- 사원번호, 사원이름, 부서이름을 가지는 뷰(v_emp_dept)를 생성하라
create view v_emp_dept
as select empno, ename, dname
from emp,dept where emp.deptno=dept.deptno;

 

뷰 삭제)

DROP VIEW viewname;
728x90

'DBMS > MySQL' 카테고리의 다른 글

[MySQL] 쿼리 종합예시  (0) 2024.03.19
[MySQL] 스토어드 프로시저  (0) 2024.03.18
[MySQL] Top N 질의문  (0) 2024.03.18
[MySQL] Join  (0) 2024.03.18
[MySQL] DB 언어 분류(DML/DDL/DCL)  (0) 2024.03.15

+ Recent posts