¿Cómo declarar una variable en MySQL?

386

¿Cómo declarar una variable en mysql, para que mi segunda consulta pueda usarla?

Me gustaría escribir algo como:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
cdub
fuente
No olvide que puede necesitar "Permitir variables de usuario = Verdadero".
Steve Smith, el

Respuestas:

636

Existen principalmente tres tipos de variables en MySQL:

  1. Variables definidas por el usuario (con el prefijo @):

    Puede acceder a cualquier variable definida por el usuario sin declararla o inicializarla. Si hace referencia a una variable que no se ha inicializado, tiene un valor NULLy un tipo de cadena.

    SELECT @var_any_var_name

    Puede inicializar una variable usando SETo SELECTinstrucción:

    SET @start = 1, @finish = 10;    

    o

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

    A las variables de usuario se les puede asignar un valor de un conjunto limitado de tipos de datos: entero, decimal, coma flotante, cadena binaria o no binaria, o valor NULL.

    Las variables definidas por el usuario son específicas de la sesión. Es decir, una variable de usuario definida por un cliente no puede ser vista o utilizada por otros clientes.

    Se pueden usar en SELECTconsultas utilizando técnicas de variables de usuario avanzadas de MySQL .

  2. Variables locales (sin prefijo):

    Las variables locales deben declararse utilizando DECLAREantes de acceder.

    Se pueden usar como variables locales y los parámetros de entrada dentro de un procedimiento almacenado:

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

    Si DEFAULTfalta la cláusula, el valor inicial es NULL.

    El alcance de una variable local es el BEGIN ... ENDbloque dentro del cual se declara.

  3. Variables del sistema del servidor (con el prefijo @@):

    El servidor MySQL mantiene muchas variables del sistema configuradas en un valor predeterminado. Pueden ser de tipo GLOBAL, SESSIONo BOTH.

    Las variables globales afectan el funcionamiento general del servidor, mientras que las variables de sesión afectan su funcionamiento para conexiones de clientes individuales.

    Para ver los valores actuales utilizados por un servidor en ejecución, use la SHOW VARIABLESinstrucción o SELECT @@var_name.

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

    Se pueden configurar al inicio del servidor usando las opciones en la línea de comando o en un archivo de opciones. La mayoría de ellos se pueden cambiar dinámicamente mientras el servidor se está ejecutando usando SET GLOBALo 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
fuente
3
De alguna manera, el =operador no funcionó para mí. Funcionó bien cuando utilicé el :=operador.
divinedragon
24
=El operador solo funciona en la SETcláusula. Para asignar valor a una variable en la SELECTconsulta, puede usar el :=operador, por ejemploSELECT @start := 1
Omesh,
2
¿Puede aclarar qué significa esto: "No es necesario declarar las variables de sesión definidas por el usuario denotadas con el prefijo @"?
billynoah
3
@billynoah Supongo que significa que las variables de sesión definidas por el usuario (que comienzan con @) no necesitan una declaración explícita; simplemente puede asignarles inmediatamente como si ya hubieran sido declarados.
jobo3208
2
Y puede asignar una variable con el resultado de una declaración de selección como esta: SET @subscriptionId = (seleccione ID de suscripción del usuario donde emailAddress='[email protected] ');
Profetas de software
28

CONJUNTO

SET @var_name = value 

O

SET @var := value

ambos operadores = y : = son aceptados


SELECCIONE

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

si se encontraron varios conjuntos de registros, solo el último valor en col2 es mantener (anular);

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

en este caso el resultado de select no contiene valores col2


Ej. Ambos métodos utilizados

- TRIGGER_BEFORE_INSERT --- establecer un valor de columna a partir de los cálculos

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
bortunac
fuente
3
¿Cuál es la diferencia entre =y :=?
Koray Tugay
2
Supongo que para la sintaxis de mysql SELECT es necesario separar el significado de = (comparación) de: = (asign)
bortunac
1
En ciertos casos, los valores que quedan en las variables pueden NO corresponder a la última fila devuelta. Por ejemplo, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10parece evaluar las asignaciones de variables antes de que se realice el pedido, por lo que el valor devuelto de @var podría no estar relacionado con ninguna de las filas devueltas. Sin embargo, los documentos no dicen en qué condiciones puede suceder esto.
Doin
15

Use establecer o seleccionar

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

ejemplo:

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

Diferentes tipos de variables:

  • Las variables locales (que no tienen el prefijo @) están fuertemente tipadas y definidas en el bloque de programa almacenado en el que se declaran. Tenga en cuenta que, tal como se documenta en DECLARE Syntax :

DECLARE está permitido solo dentro de una declaración compuesta BEGIN ... END y debe estar al inicio, antes de cualquier otra declaración.

  • Las variables de usuario (que tienen el prefijo @) se escriben libremente y se definen en la sesión. Tenga en cuenta que no necesitan ni pueden declararse, simplemente utilícelos directamente.

Por lo tanto, si está definiendo un programa almacenado y realmente desea una "variable local", deberá soltar el carácter @ y asegurarse de que su declaración DECLARE esté al comienzo de su bloque de programa. De lo contrario, para usar una "variable de usuario", descarte la declaración DECLARE.

Además, deberá encerrar su consulta entre paréntesis para ejecutarla como una subconsulta:

SET @countTotal = (SELECCIONAR CUENTA (*) DESDE nGrams);

O bien, podría usar SELECT ... INTO:

SELECCIONE EL CONTEO (*) EN @countTotal FROM nGrams;

mohammadAli
fuente
1

Para cualquier persona que use @variable en la función concat_ws para obtener valores concatenados, no olvide reiniciarlo con un valor vacío. De lo contrario, puede usar el valor anterior para la misma sesión.

Set @Ids = '';

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

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

yaya
fuente
-3

Valor ajustado

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