본문 바로가기
데이터 베이스/MySQL

MYSQL IF ELSE &CASE&동적sql 예제&문제 12

by 인생여희 2016. 12. 15.
반응형



-- SQL PROGRAMING


DELIMITER $$


CREATE PROCEDURE NAME()

BEGIN


SQL CODING


END$$


DELIMITER;


CALL NAME();


-- --------------------

형식 


IF <부울 표현식 >THEN


SQL 문장 


ELSE 


SQL 문장 


END IF;


-- EX)


DROP PROCEDURE IF EXISTS ifProc;

DELIMITER $$

CREATE PROCEDURE ifProc()

BEGIN

DECLARE var1 INT;  -- 변수 선언 

    SET var1 = 100; -- 변수에 값 대입 

if var1 = 100 then -- 만약 @VAR1이 100 이하라면 


select 'it is 100';


ELSE


select 'it is not 100';

end if;

end $$

DELIMITER;


call ifProc();



-- 사용자 정의 변수를 만들때 앞에 @를 붙인다. 하지만 스토어드 프로시져나 함수등에서는 DECLARE문을 사용해서 지역변수를 선언할 수 있다.

-- 이 지역변수는 앞에 @를 붙이지 않고 ,일반 프로그래밍 언어의 변수처럼 사용하면 된다. 



DROP PROCEDURE IF EXISTS ifProc2;


use employees;


DELIMITER$$

CREATE PROCEDURE ifProc2()

BEGIN

DECLARE hireDate DATE; -- 입사일

    DECLARE curDATE DATE; -- 오늘

    DECLARE days INT ; -- 근무한 일수 


 

select hire_date into hireDate -- HIRE_DATE 의 결과를 변수에 대입

from employees

where emp_no=10001;



SET curDATE = current_date();  -- 현재날짜 

SET days = datediff(curDATE, hireDATE); -- 날짜의 차이 , 일 단위 


IF (days/365) >= 5 then 


select concat('입사한지 ', days ,'일이나 지났습니다. 축하합니다.');

    

else

select '입사한지 ' + days + '일 밖에 안되었네요 열심히 일하세요 ';

end if;


end$$

delimiter;


call ifProc2();


-- -----------------------------------------------------

-- IF ELSE 


DROP PROCEDURE IF EXISTS ifProc3;

DELIMITER $$

CREATE PROCEDURE ifProc3()

BEGIN


DECLARE point INT;

    DECLARE credit CHAR(1);

    

    SET point = 77;

    

    

    IF point >= 90 THEN

    

SET credit = 'a';

    

    ELSEIF point >= 80 then

set credit ='b';

    

    ELSEIF point >= 70 then

    

set credit ='c';

    

    ELSEIF point >= 60 then

set credit = 'd';

        

else 

       set credit = 'f';

       

end if;

    

    select concat('jumsoo==>',point), concat('hakjum',credit);


end $$

    

    DELIMITER;

    

CALL ifProc3();



-- CASE


DROP PROCEDURE IF EXISTS caseProc;

DELIMITER $$


CREATE PROCEDURE caseProc()


BEGIN

DECLARE point INT;

    DECLARE credit CHAR(1);

    SET point = 77;

    

    CASE

    

WHEN point >= 90 then 

            set credit = 'a';



WHEN point >= 80 then 

            set credit = 'b';

            

            

WHEN point >= 70 then 

            set credit = 'c';

            

            

WHEN point >= 60 then 

            set credit = 'd';


else 

            set credit = 'f';

            

end case;

        

        select concat('jumsoo==>', point), concat('hakjum==>', credit);


end $$

    DELIMITER;

    

    call caseProc();







-- 

-- WHILE /  ITERATE / LEAVE

-- 

-- 

-- 형식 :

-- 

-- WHILE 식  DO

-- 

-- SQL 명령문 

-- 

-- END WHILE;


-- 1에서 100까지의 값을 모두 더하는 간단한 기능을 구연해 보자

-- 


DROP PROCEDURE IF EXISTS whileProc;

DELIMITER $$


CREATE PROCEDURE whileProc()


BEGIN

DECLARE i INT ; 

    DECLARE hap INT;

    

    SET i = 1;

    SET hap = 0;

    

    WHILE (i<=100) DO

    

SET hap = hap +i;

        SET i = i+1 ; 

        

        END WHILE;

        

        SELECT hap;

END $$

    DELIMITER;

    

    CALL whileProc();





-- iterate , leave




DROP PROCEDURE IF EXISTS whileProc2;

DELIMITER $$


CREATE PROCEDURE whileProc2()


BEGIN

DECLARE i INT ; 

    DECLARE hap INT;



    SET i = 1;

    SET hap = 0;

    

    myWhile:WHILE (i<=100) DO --     WHILE 문에 LABEL을 지정 


    

IF (i%7 = 0) then

            SET i = i+1 ;

iterate myWhile; -- 지정한 LABEL 문으로 가서 계속 실행 

end if;

    

SET hap = hap +i;

        

        if(hap > 1000) then

LEAVE myWhile ; -- 지정한 LABEL 문을 떠남 , 즉 WHILE 종료 


        END if;

        

        set i = i+1;

        

end while;

        

        SELECT hap;

END $$

    DELIMITER;

    

    

    CALL whileProc2();





-- 동적 쿼리  


-- REPARE는 쿼리를 준비하는 명령어 이고 ,   EXECUTE는 앞에서 준비한 쿼리를 실행하는 명령문이다. 

-- EXECUTE 에서 USING 을 이용해서 값을 전달할수도 있다. 



DROP TABLE IF EXISTS EXAM;

CREATE TABLE EXAM(ID INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME);


SET @curDATE = CURRENT_TIMESTAMP();


PREPARE myQuery from 'INSERT INTO EXAM VALUES(NULL,?)';

EXECUTE myQuery USING @curDATE;

DEALLOCATE PREPARE myQuery;


select * from EXAM;



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
-- SQL PROGRAMING
 
DELIMITER $$
 
CREATE PROCEDURE NAME()
BEGIN
 
SQL CODING
 
END$$
 
DELIMITER;
 
CALL NAME();
 
-- --------------------
형식 
 
IF <부울 표현식 >THEN
 
SQL 문장 
 
ELSE 
 
SQL 문장 
 
END IF;
 
-- EX)
 
DROP PROCEDURE IF EXISTS ifProc;
DELIMITER $$
CREATE PROCEDURE ifProc()
BEGIN
    DECLARE var1 INT;  -- 변수 선언 
    SET var1 = 100-- 변수에 값 대입 
if var1 = 100 then -- 만약 @VAR1이 100 이하라면 
 
select 'it is 100';
 
ELSE
 
select 'it is not 100';
 
end if;
end $$
DELIMITER;
 
call ifProc();
 
 
-- 사용자 정의 변수를 만들때 앞에 @를 붙인다. 하지만 스토어드 프로시져나 함수등에서는 DECLARE문을 사용해서 지역변수를 선언할 수 있다.
-- 이 지역변수는 앞에 @를 붙이지 않고 ,일반 프로그래밍 언어의 변수처럼 사용하면 된다. 
 
 
 
 
 
DROP PROCEDURE IF EXISTS ifProc2;
 
use employees;
 
DELIMITER$$
CREATE PROCEDURE ifProc2()
BEGIN
    DECLARE hireDate DATE; -- 입사일
    DECLARE curDATE DATE; -- 오늘
    DECLARE days INT ; -- 근무한 일수 
 
 
select hire_date into hireDate -- HIRE_DATE 의 결과를 변수에 대입
from employees
where emp_no=10001;
 
 
SET curDATE = current_date();  -- 현재날짜 
SET days = datediff(curDATE, hireDATE); -- 날짜의 차이 , 일 단위 
 
IF (days/365>= 5 then 
 
    select concat('입사한지 ', days ,'일이나 지났습니다. 축하합니다.');
    
else
    select '입사한지 ' + days + '일 밖에 안되었네요 열심히 일하세요 ';
end if;
 
end$$
delimiter;
 
call ifProc2();
 
 
 
 
 
-- -----------------------------------------------------
 
-- IF ELSE 
 
DROP PROCEDURE IF EXISTS ifProc3;
DELIMITER $$
CREATE PROCEDURE ifProc3()
BEGIN
 
    DECLARE point INT;
    DECLARE credit CHAR(1);
    
    SET point = 77;
    
    
    IF point >= 90 THEN
    
        SET credit = 'a';
    
    ELSEIF point >= 80 then
    
        set credit ='b';
    
    ELSEIF point >= 70 then
    
        set credit ='c';
    
    ELSEIF point >= 60 then
    
        set credit = 'd';
        
    else 
        
       set credit = 'f';
       
    end if;
    
    select concat('jumsoo==>',point), concat('hakjum',credit);
 
    end $$
    
    DELIMITER;
    
CALL ifProc3();
 
 
-- CASE
 
DROP PROCEDURE IF EXISTS caseProc;
DELIMITER $$
 
CREATE PROCEDURE caseProc()
 
BEGIN
    DECLARE point INT;
    DECLARE credit CHAR(1);
    SET point = 77;
    
    CASE
    
        WHEN point >= 90 then 
            
            set credit = 'a';
 
 
        WHEN point >= 80 then 
            
            set credit = 'b';
            
            
        WHEN point >= 70 then 
            set credit = 'c';
            
            
            
        WHEN point >= 60 then 
            
            set credit = 'd';
 
        else 
            
            set credit = 'f';
            
        end case;
        
        select concat('jumsoo==>', point), concat('hakjum==>', credit);
 
    end $$
    DELIMITER;
    
    call caseProc();
 
 
 
 
 
 
-- 
-- WHILE /  ITERATE / LEAVE
-- 
-- 
-- 형식 :
-- 
-- WHILE 식  DO
-- 
-- SQL 명령문 
-- 
-- END WHILE;
-- 
-- 1에서 100까지의 값을 모두 더하는 간단한 기능을 구연해 보자
-- 
 
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
 
CREATE PROCEDURE whileProc()
 
BEGIN
    DECLARE i INT ; 
    DECLARE hap INT;
    
    SET i = 1;
    SET hap = 0;
    
    WHILE (i<=100) DO
    
        SET hap = hap +i;
        SET i = i+1 ; 
        
        END WHILE;
        
        SELECT hap;
    END $$
    DELIMITER;
    
    CALL whileProc();
 
 
 
 
-- iterate , leave
 
 
 
DROP PROCEDURE IF EXISTS whileProc2;
DELIMITER $$
 
CREATE PROCEDURE whileProc2()
 
BEGIN
    DECLARE i INT ; 
    DECLARE hap INT;
 
 
    SET i = 1;
    SET hap = 0;
    
    myWhile:WHILE (i<=100) DO --     WHILE 문에 LABEL을 지정 
 
    
        IF (i%7 = 0) then
            
            SET i = i+1 ;
        
            iterate myWhile; -- 지정한 LABEL 문으로 가서 계속 실행 
        end if;
    
        SET hap = hap +i;
        
        if(hap > 1000) then
            LEAVE myWhile ; -- 지정한 LABEL 문을 떠남 , 즉 WHILE 종료 
 
        END if;
        
        set i = i+1;
        
    end while;
        
        SELECT hap;
    END $$
    DELIMITER;
    
    
    CALL whileProc2();
 
 
 
 
-- 동적 쿼리  
 
-- REPARE는 쿼리를 준비하는 명령어 이고 ,   EXECUTE는 앞에서 준비한 쿼리를 실행하는 명령문이다. 
-- EXECUTE 에서 USING 을 이용해서 값을 전달할수도 있다. 
 
 
DROP TABLE IF EXISTS EXAM;
CREATE TABLE EXAM(ID INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME);
 
SET @curDATE = CURRENT_TIMESTAMP();
 
PREPARE myQuery from 'INSERT INTO EXAM VALUES(NULL,?)';
EXECUTE myQuery USING @curDATE;
DEALLOCATE PREPARE myQuery;
 
select * from EXAM;
 
 
 
 
 
 
 
 
 
 
cs




반응형

댓글