MySQL에서 변수를 선언하는 방법?


386

두 번째 쿼리에서 사용할 수 있도록 mysql에서 변수를 선언하는 방법은 무엇입니까?

나는 다음과 같은 것을 쓰고 싶다 :

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

"Allow User Variables = True"가 필요할 수 있음을 잊지 마십시오.
Steve Smith

답변:


636

MySQL에는 주로 세 가지 유형의 변수가 있습니다.

  1. 접두사가 붙은 사용자 정의 변수@ :

    선언하거나 초기화하지 않고도 모든 사용자 정의 변수에 액세스 할 수 있습니다. 초기화되지 않은 변수를 참조하면 값 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쿼리에 사용할 수 있습니다 .

  2. 지역 변수 (접두사 없음) :

    지역 변수는 다음을 사용하여 선언해야합니다. 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가 선언 된 블록입니다.

  3. 서버 시스템 변수 (접두사로 시작 @@) :

    MySQL 서버 는 기본값으로 구성된 많은 시스템 변수를 유지 관리 합니다. 유형 GLOBALSESSION또는 일 수 있습니다 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;

3
어떻게 든 =연산자가 나를 위해 작동하지 않았습니다. :=연산자를 사용할 때 제대로 작동했습니다 .
divinedragon

24
=연산자는 SET절 에서만 작동합니다 . SELECT쿼리 에서 변수에 값을 할당하기 위해 :=연산자 를 사용할 수 있습니다.SELECT @start := 1
Omesh

2
이것이 무엇을 의미하는지 명확하게 설명해 주시겠습니까? "접두사 @로 표시된 사용자 정의 세션 변수를 선언 할 필요가 없습니다"?
billynoah

3
@billynoah 나는 사용자 정의 세션 변수 (@로 시작)가 명시 적 선언이 필요하지 않다는 것을 의미한다고 가정합니다. 마치 이미 선언 된 것처럼 즉시 할당 할 수 있습니다.
jobo3208

2
다음과 같은 select 문의 결과를 사용하여 변수를 할당 할 수 있습니다. SET @subscriptionId = (user에서 select subscriptionId : emailAddress='ac@tmail.com ');
소프트웨어 예언자

28

세트

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;
...

3
차이점은 무엇이며 =그리고 :=?
Koray Tugay

2
mysql SELECT 구문의 경우 = (비교)와 : = (asign)의 의미를 구분하는 데 필요합니다.
bortunac

1
경우에 따라 변수에 남은 값이 마지막으로 반환 된 행과 일치하지 않을 수 있습니다. 예를 들어, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10order-by가 완료되기 전에 변수 할당을 평가하여 @var의 반환 값이 반환 된 행과 관련이없는 것처럼 보입니다. 그러나 문서는 이것이 어떤 조건에서 발생할 수 있는지 말하지 않습니다.
Doin


3

다양한 유형의 변수 :

  • 지역 변수 (@로 시작하지 않음)는 선언 된 저장된 프로그램 블록으로 범위가 지정되고 범위가 지정됩니다. 아래에 설명 된대로, 그 주 DECLARE 구문 :

DECLARE는 BEGIN ... END 복합 명령문 내에서만 허용되며 다른 명령문보다 먼저 시작해야합니다.

  • 사용자 변수 (@로 시작)는 느슨하게 입력되고 세션 범위가 지정됩니다. 그것들을 필요로하거나 선언 할 수는 없으며 직접 사용하십시오.

따라서, 저장된 프로그램을 정의하고 실제로 "로컬 변수"를 원하는 경우 @ 문자를 삭제하고 DECLARE 문이 프로그램 블록의 시작 부분에 있는지 확인해야합니다. 그렇지 않으면 "사용자 변수"를 사용하려면 DECLARE 문을 삭제하십시오.

또한 하위 쿼리로 쿼리를 실행하려면 쿼리를 괄호로 묶어야합니다.

SET @countTotal = (SELECT nCOUNT (*) FROM nGrams);

그렇지 않으면 SELECT ... INTO를 사용할 수 있습니다.

@countTotal에서 COUNT (*)를 선택 nGrams;


1

concat_ws 함수에서 @variable을 사용하여 연결된 값을 얻는 사람은 빈 값으로 다시 초기화하는 것을 잊지 마십시오. 그렇지 않으면 동일한 세션에 대해 이전 값을 사용할 수 있습니다.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;

0
  • 알리다: SET @a = 1;

  • 용법: INSERT INTO `t` (`c`) VALUES (@a);


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.