저희가 코딩을할때 ‘변수’를 많이 씁니다.
쉽게 말해 변수란 숫자, 문자 등의 간단한 자료를 잠시 저장해두는 통이라고 생각하는데요.
만들어서 사용해봅시다.
변수 문법
변수는 길고 복잡한 자료를 잠시 저장해주는 통일뿐인데요.
SET 키워드를 이용해서 만들어줍니다.
SET @age = 20;
SELECT @age := 20;
= 나 아라비아 상형문자 같은 := 써도 같은 문법입니다.
SELECT @변수명 := 값; 이것도 같은 뜻인데요.
편한거 쓰십쇼
그래서 위처럼 작성하면 age라는 변수명에 20이 저장됩니다.
SET @age = 20;
SELECT @age;
그럼 앞으로 @변수명이라고 쓸때마다 그 자리에 저장했던 자료가 남습니다.
그래서 위처럼 쿼리짜면 20이 출력됩니다.
SET @price = 60000;
SELECT * FROM product WHERE 가격 @price;
이러면 무슨 뜻일까요?
상품이 6000인 것만 출력해달라는 뜻입니다.
SET @price = (SELECT COUNT(*) FROM product WHERE 가격 = 5000)
당연히 값이 들어갈 곳에 서브쿼리가 들어가도 상관없습니다.
SET @age = 20;
SET @age = @age + 1;
SELECT @age;
기존 변수에 값을 수정할때 ‘값 변경’이 아닌 ‘값 추가’를 하고싶다면
SET 변수 = 변수 + 1 하면 됩니다.
??? : procedure이랑 비슷한데요?
그건 여러 SQL 쿼리를 저장할때 쓰면 되고
@변수에는 숫자, 문자, binary, null 이런 자료 1개만 저장을 할 수 있습니다.
그럴때 사용하면됩니다.
procedure 안에서 변수 만들어써보기
procedure 안에선 DECLARE 코드로 변수를 생성하는 경우가 많은데요.
CREATE PROCEDURE mart.var_test()
BEGIN
DECLARE 변수1 INT;
DECLARE 변수2 VARCHAR(100);
DECLARE 변수3 INT DEFAULT 123;
END
- DECLARE 변수명 데이터타입; 이렇게 적으면 분수를 만들 수 있는데요, 여기는 변수명 @ ←이런거 안써도 됩니다.
- 다만 BEGIN 바로 밑에 넣어야합니다. 안그러면 에러 나버립니다.
- DEFAULT 어쩌구는 변수를 만들때 초기 값을 넣어주는 부분입니다.(선택사항)
- DECLARE 로 만든 변수에 데이터 저장시엔 똑같이 SET 으로 변수에 마음대로 데이터 저장가능합니다.
CREATE PROCEDURE mart.var_test()
BEGIN
DECLARE 변수1 INT;
SET 변수1 = 10;
SET 변수1 = 변수1 + 1;
SELECT 변수1;
END
- 변수에 데이터를 새로 집어 넣고 싶다면 SET을 이용합니다.
- 변수 기존 값에 1만 더해주고 싶으면 ? 변수1 + 1;
그럼 위 코드는 어떤게 출력될까요?
.
.
.
11입니다!(약간 정처기 문제같네요 ㅋㅋㅋㅋㅋ)
DECLARE 변수 vs @변수 차이점
1. 변수를 사용할 수 있는 범위의 차이가 있습니다.
@변수 는 user variable 이라고 부르는데, 한번 만들어놓으면 DBMS가 종료될때까지 남아있습니다.(연결종료)
그리고 제가 추가로 작성하는 SQL모든 파일에서 전역으로 사용가능합니다.
그래서 가끔은 @변수를 똑같은 이름으로 중복선언하는 미스테잌도 발생해서 사람들이 별로 잘 안씁니다.
반면 DECLARE 변수는 변수를 만든 procedure 안에서만 사용가능하지요.
그래서 마음대로 만들어도 안-전⛑️합니다.
2. 변수가 언제사라지는지도 차이가 있습니다.
아까 @변수는 [DB연결 종료시] 사라진다고 했죠?
DECLARE 변수는 [procedure 종료시] 바로 사라집니다.
진짠지 한번 확인해봅시다.
DROP PROCEDURE IF EXISTS emart.var_test;
DELIMITER $$
CREATE PROCEDURE emart.var_test()
BEGIN
DECLARE 나이 int DEFAULT 10;
SET 나이 = 나이 + 10;
SELECT 나이;
END
$$
DELIMITER ;
CALL emart.var_test();
CALL emart.var_test();
CALL emart.var_test();
- 나이라는 변수를 만들고 기본값은 10을 넣어놨슴다.
- 그리고 변수에 10을 더합니다.
- 출력합니다.
별건 아닌데요. 이렇게 만들어두면 var_test 프로시저를 실행할때마다 항상 ‘20’이 출력됩니다.
왜냐면 위에 말씀드렸다 싶이 procedure이 끝나면 DECLARE 사라지게 되기때문이죠.
procedure은 실행할때마다 DECLARE 변수는 리셋된다고 생각하면 될 것 같습니다.
그럼 @변수는 어떻게 나오는지 볼까요?
DROP PROCEDURE IF EXISTS emart.var_test2;
DELIMITER $$
CREATE PROCEDURE emart.var_test2()
BEGIN
SET @나이 = @나이 + 10;
SELECT @나이;
-- [SELECT 나이]라고 하면 에러남
-- [SELECT @나이 AS 나이]
END
$$
DELIMITER ;
SET @나이 = 10;
CALL emart.var_test2();
CALL emart.var_test2();
CALL emart.var_test2();
(하나씩 실행해야함.)
넵. 20 30 40 이런식으로 출력됩니다.(왜냐하면 user variable을 한번 만들면 접속종료전까지 계속 남아 있어서 그럽니다.)
DECLARE을 애용합시다.
또 다른 DBMS 에서는…?
Oracle, PostgreSQL 둘 다 procedure 안에서만 DECLARE 키워드로 변수 만들어서 쓰는 경우가 많습니다.
MySQL의 이상한 @변수 ← 이런거 없음
오늘의 결론
코드짜다가 너무 자주쓰는 문자나 숫자 자료를 발견한다면
그걸 변수에 저장해두고 두고두고 써보자잇
실습
1. 저의 이름, 나이를 변수로 각각 만들어서 저장하고 출력해보겠습니다.
SET @이름 = '국나뇽';
SET @나이 = 26;
SELECT @이름, @나이;
굿이네요.
2. 방금 만든 2개의 변수를 함께 문자로 합쳐서 출력해보겠습니다.
ex) 국나뇽 26 이렇게 말입니다.
SET @이름 = '국나뇽';
SET @나이 = 26;
SELECT CONCAT(@이름, ' ', @나이);
3. 이걸 DECLARE에 저장해서 써보겠습니다.
CREATE PROCEDURE emart.swkuk_info()
BEGIN
DECLARE 이름 VARCHAR(100);
DECLARE 나이 INT;
SET 이름 = '국나뇽';
SET 나이 = 26;
SELECT 이름, 나이;
END
CALL swkuk_info();
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
procedure, function 안에서 쓸 수 있는 IF문법 (0) | 2024.03.28 |
---|---|
procedure 많이 만들기 싫다면? 파라미터로 해결하세요~ (0) | 2024.03.28 |
저장 프로시저 stored procedure 쓰면 나도 알파메일 (0) | 2024.03.28 |
table 대신 view 쓰는 이유!?!? (0) | 2024.03.28 |
데이터 수정 삭제는 UPDATE / DELETE (0) | 2024.03.14 |