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;
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;
Respostas:
Existem principalmente três tipos de variáveis no MySQL:
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 NULL
e um tipo de sequência.
SELECT @var_any_var_name
Você pode inicializar uma variável usando SET
ou SELECT
instruçã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 SELECT
consultas usando técnicas avançadas de variáveis de usuário do MySQL .
Variáveis locais (sem prefixo):
Variáveis locais precisam ser declaradas usando DECLARE
antes 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 DEFAULT
cláusula estiver ausente, o valor inicial é NULL
.
O escopo de uma variável local é o BEGIN ... END
bloco dentro do qual ela é declarada.
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
, SESSION
ou 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 VARIABLES
instruçã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 GLOBAL
ou 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;
=
operador não funcionou para mim. Funcionou bem quando eu usei :=
operador.
=
O operador trabalha apenas na SET
cláusula. Para atribuir valor a uma variável na SELECT
consulta, você pode usar o :=
operador, por exemploSELECT @start := 1
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;
...
=
e :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
parece 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.
Use set ou selecione
SET @counter := 100;
SELECT @variable_name := value;
exemplo:
SELECT @price := MAX(product.price)
FROM product
Diferentes tipos de variáveis:
DECLARE é permitido apenas dentro de uma instrução composta BEGIN ... END e deve estar no início, antes de qualquer outra instrução.
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;
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;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;