답변:
MySQL에는 주로 세 가지 유형의 변수가 있습니다.
접두사가 붙은 사용자 정의 변수@
:
선언하거나 초기화하지 않고도 모든 사용자 정의 변수에 액세스 할 수 있습니다. 초기화되지 않은 변수를 참조하면 값 NULL
과 문자열 유형이 있습니다.
SELECT @var_any_var_name
SET
또는 SELECT
문을 사용하여 변수를 초기화 할 수 있습니다 .
SET @start = 1, @finish = 10;
또는
SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
사용자 변수는 정수, 10 진수, 부동 소수점, 2 진 또는 비 이진 문자열 또는 NULL 값과 같은 제한된 데이터 유형 세트에서 값을 지정할 수 있습니다.
사용자 정의 변수는 세션마다 다릅니다. 즉, 한 클라이언트에서 정의한 사용자 변수는 다른 클라이언트에서 보거나 사용할 수 없습니다.
고급 MySQL 사용자 변수 기술을 사용하는 SELECT
쿼리에 사용할 수 있습니다 .
지역 변수 (접두사 없음) :
지역 변수는 다음을 사용하여 선언해야합니다. DECLARE
액세스하기 전에를 합니다.
스토어드 프로 시저 내에서 로컬 변수 및 입력 매개 변수로 사용할 수 있습니다.
DELIMITER //
CREATE PROCEDURE sp_test(var1 INT)
BEGIN
DECLARE start INT unsigned DEFAULT 1;
DECLARE finish INT unsigned DEFAULT 10;
SELECT var1, start, finish;
SELECT * FROM places WHERE place BETWEEN start AND finish;
END; //
DELIMITER ;
CALL sp_test(5);
은 if DEFAULT
절이없는, 초기 값입니다 NULL
.
지역 변수의 범위는 변수 BEGIN ... END
가 선언 된 블록입니다.
서버 시스템 변수 (접두사로 시작 @@
) :
MySQL 서버 는 기본값으로 구성된 많은 시스템 변수를 유지 관리 합니다. 유형 GLOBAL
은 SESSION
또는 일 수 있습니다 BOTH
.
전역 변수는 서버의 전체 작업에 영향을주는 반면 세션 변수는 개별 클라이언트 연결에 대한 작업에 영향을줍니다.
실행중인 서버에서 사용하는 현재 값을 보려면 SHOW VARIABLES
또는 문을 사용하십시오 SELECT @@var_name
.
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
명령 행 또는 옵션 파일의 옵션을 사용하여 서버 시작시 설정할 수 있습니다. 서버가 사용하는 실행되는 동안 그들 대부분은 동적으로 변경 될 수 있습니다 SET GLOBAL
또는 SET SESSION
:
-- Syntax to Set value to a Global variable:
SET GLOBAL sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000;
-- Syntax to Set value to a Session variable:
SET sort_buffer_size=1000000;
SET SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@local.sort_buffer_size=10000;
=
연산자가 나를 위해 작동하지 않았습니다. :=
연산자를 사용할 때 제대로 작동했습니다 .
=
연산자는 SET
절 에서만 작동합니다 . SELECT
쿼리 에서 변수에 값을 할당하기 위해 :=
연산자 를 사용할 수 있습니다.SELECT @start := 1
세트
SET @var_name = value
또는
SET @var := value
연산자 = 와 : = 모두 허용됩니다
고르다
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
여러 레코드 세트가 col2의 마지막 값만 발견하면 유지 (재정의)입니다.
SELECT col1, col2 INTO @var_name, col3 FROM .....
이 경우 select 결과에 col2 값이 포함되지 않습니다
사용 된 두 가지 방법 모두
-TRIGGER_BEFORE_INSERT --- 계산에서 열 값 설정
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
=
그리고 :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
order-by가 완료되기 전에 변수 할당을 평가하여 @var의 반환 값이 반환 된 행과 관련이없는 것처럼 보입니다. 그러나 문서는 이것이 어떤 조건에서 발생할 수 있는지 말하지 않습니다.
세트 사용 또는 선택
SET @counter := 100;
SELECT @variable_name := value;
예 :
SELECT @price := MAX(product.price)
FROM product
다양한 유형의 변수 :
DECLARE는 BEGIN ... END 복합 명령문 내에서만 허용되며 다른 명령문보다 먼저 시작해야합니다.
따라서, 저장된 프로그램을 정의하고 실제로 "로컬 변수"를 원하는 경우 @ 문자를 삭제하고 DECLARE 문이 프로그램 블록의 시작 부분에 있는지 확인해야합니다. 그렇지 않으면 "사용자 변수"를 사용하려면 DECLARE 문을 삭제하십시오.
또한 하위 쿼리로 쿼리를 실행하려면 쿼리를 괄호로 묶어야합니다.
SET @countTotal = (SELECT nCOUNT (*) FROM nGrams);
그렇지 않으면 SELECT ... INTO를 사용할 수 있습니다.
@countTotal에서 COUNT (*)를 선택 nGrams;