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@startAND@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.
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;
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;...
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.
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;
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.
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.Você pode inicializar uma variável usando
SET
ouSELECT
instrução:ou
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:
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
ouBOTH
.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 ouSELECT @@var_name
.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
ouSET SESSION
:fonte
=
operador não funcionou para mim. Funcionou bem quando eu usei:=
operador.=
O operador trabalha apenas naSET
cláusula. Para atribuir valor a uma variável naSELECT
consulta, você pode usar o:=
operador, por exemploSELECT @start := 1
OU
ambos os operadores = e : = são aceitos
se vários conjuntos de registros encontrados, apenas o último valor em col2 é keep (override);
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
fonte
=
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
exemplo:
fonte
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:
Ou então, você pode usar SELECT ... INTO:
fonte
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.
fonte
Declarar:
SET @a = 1;
Uso:
INSERT INTO `t` (`c`) VALUES (@a);
fonte
Valor SET
fonte