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

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

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

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;



답변

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;

답변

세트

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


답변

세트 사용 또는 선택

SET @counter := 100;
SELECT @variable_name := value;

예 :

SELECT @price := MAX(product.price)
FROM product 


답변

다양한 유형의 변수 :

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

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

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

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

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

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

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

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


답변

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

Set @Ids = '';

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


답변

  • 알리다:
    SET @a = 1;

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


답변

설정 값

 declare Regione int;
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;