Como declarar uma variável no MySQL?

386

Como declarar uma variável no mysql, para que minha segunda consulta possa usá-la?

Eu gostaria de escrever algo como:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
cdub
fonte
Não esqueça que você pode precisar de "Allow User Variables = True".
9788 Steve

Respostas:

636

Existem principalmente três tipos de variáveis ​​no MySQL:

  1. Variáveis ​​definidas pelo usuário (prefixadas com @):

    Você pode acessar qualquer variável definida pelo usuário sem declará-la ou inicializá-la. Se você se referir a uma variável que não foi inicializada, ela possui um valor NULLe um tipo de sequência.

    SELECT @var_any_var_name

    Você pode inicializar uma variável usando SETou SELECTinstrução:

    SET @start = 1, @finish = 10;    

    ou

    SELECT @start := 1, @finish := 10;
    
    SELECT * FROM places WHERE place BETWEEN @start AND @finish;

    As variáveis ​​do usuário podem receber um valor de um conjunto limitado de tipos de dados: número inteiro, decimal, ponto flutuante, sequência binária ou não binária ou valor NULL.

    Variáveis ​​definidas pelo usuário são específicas da sessão. Ou seja, uma variável de usuário definida por um cliente não pode ser vista ou usada por outros clientes.

    Eles podem ser usados ​​em SELECTconsultas usando técnicas avançadas de variáveis ​​de usuário do MySQL .

  2. Variáveis ​​locais (sem prefixo):

    Variáveis ​​locais precisam ser declaradas usando DECLAREantes de acessá-lo.

    Eles podem ser usados ​​como variáveis ​​locais e os parâmetros de entrada dentro de um procedimento armazenado:

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

    Se a DEFAULTcláusula estiver ausente, o valor inicial é NULL.

    O escopo de uma variável local é o BEGIN ... ENDbloco dentro do qual ela é declarada.

  3. Variáveis ​​de sistema do servidor (prefixadas com @@):

    O servidor MySQL mantém muitas variáveis ​​do sistema configuradas com um valor padrão. Eles podem ser do tipo GLOBAL, SESSIONou BOTH.

    Variáveis ​​globais afetam a operação geral do servidor, enquanto variáveis ​​de sessão afetam sua operação para conexões de clientes individuais.

    Para ver os valores atuais usados ​​por um servidor em execução, use a SHOW VARIABLESinstrução ou SELECT @@var_name.

    SHOW VARIABLES LIKE '%wait_timeout%';
    
    SELECT @@sort_buffer_size;

    Eles podem ser configurados na inicialização do servidor usando opções na linha de comandos ou em um arquivo de opções. A maioria deles pode ser alterada dinamicamente enquanto o servidor está sendo executado usando SET GLOBALou 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;
Omesh
fonte
3
De alguma forma, o =operador não funcionou para mim. Funcionou bem quando eu usei :=operador.
divinedragon
24
=O operador trabalha apenas na SETcláusula. Para atribuir valor a uma variável na SELECTconsulta, você pode usar o :=operador, por exemploSELECT @start := 1
Omesh
2
Você pode esclarecer o que isso significa: "Não há necessidade de declarar variáveis ​​de sessão definidas pelo usuário denotadas com prefixo @"?
Billynoah
3
@billynoah Estou assumindo que isso significa que as variáveis ​​de sessão definidas pelo usuário (que começam com @) não precisam de uma declaração explícita; você pode atribuir a eles imediatamente como se eles já tivessem sido declarados.
jobo3208
2
E você pode atribuir uma variável com o resultado de uma instrução select como esta: SET @subscriptionId = (selecione subscriptionId no usuário em que emailAddress='[email protected] ');
Profetas de Software
28

CONJUNTO

SET @var_name = value 

OU

SET @var := value

ambos os operadores = e : = são aceitos


SELECT

SELECT col1, @var_name := col2 from tb_name WHERE "conditon";

se vários conjuntos de registros encontrados, apenas o último valor em col2 é keep (override);

SELECT col1, col2 INTO @var_name, col3 FROM .....

nesse caso, o resultado de select não contém valores de col2


Ex ambos os métodos utilizados

- TRIGGER_BEFORE_INSERT --- definindo um valor de coluna a partir dos cálculos

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
Bortunac
fonte
3
Qual é a diferença entre =e :=?
Koray Tugay
2
Eu acho que para a sintaxe Select mysql é necessário separar o significado = (Comparativo) de: = (Assign)
bortunac
11
Em certos casos, os valores deixados nas variáveis ​​NÃO podem corresponder à última linha retornada. Por exemplo, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10parece avaliar as atribuições de variáveis ​​antes que a ordem seja concluída, para que o valor retornado de @var possa nem se relacionar a nenhuma das linhas retornadas. Os documentos não dizem em que condições isso pode acontecer.
Doin
15

Use set ou selecione

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

exemplo:

SELECT @price := MAX(product.price)
FROM product 
Mohammad Mahdi KouchakYazdi
fonte
3

Diferentes tipos de variáveis:

  • variáveis ​​locais (que não são prefixadas por @) são fortemente tipadas e com escopo definido para o bloco de programa armazenado no qual são declaradas. Observe que, conforme documentado na sintaxe DECLARE :

DECLARE é permitido apenas dentro de uma instrução composta BEGIN ... END e deve estar no início, antes de qualquer outra instrução.

  • As variáveis ​​de usuário (que são prefixadas por @) são de tipo vagamente digitado e com escopo definido para a sessão. Observe que eles não precisam nem podem ser declarados - basta usá-los diretamente.

Portanto, se você estiver definindo um programa armazenado e realmente desejar uma "variável local", precisará soltar o caractere @ e garantir que sua instrução DECLARE esteja no início do seu bloco de programa. Caso contrário, para usar uma "variável de usuário", solte a instrução DECLARE.

Além disso, você precisará colocar sua consulta entre parênteses para executá-la como uma subconsulta:

SET @countTotal = (SELECIONE A CONTAGEM (*) DE nGrams);

Ou então, você pode usar SELECT ... INTO:

SELECIONE A CONTAGEM (*) EM @countTotal FROM nGrams;

mohammadAli
fonte
1

Para qualquer pessoa que use a função @variable in concat_ws para obter valores concatenados, não se esqueça de reinicializá-lo com valor vazio. Caso contrário, ele pode usar o valor antigo para a mesma sessão.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
Imran Javed
fonte
0
  • Declarar: SET @a = 1;

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

yaya
fonte
-3

Valor SET

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