Comment déclarer une variable dans MySQL?

386

Comment déclarer une variable dans mysql, pour que ma deuxième requête puisse l'utiliser?

Je voudrais écrire quelque chose comme:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
cdub
la source
N'oubliez pas que vous devrez peut-être "Autoriser les variables utilisateur = Vrai".
Steve Smith

Réponses:

636

Il existe principalement trois types de variables dans MySQL:

  1. Variables définies par l'utilisateur (préfixées par @):

    Vous pouvez accéder à n'importe quelle variable définie par l'utilisateur sans la déclarer ni l'initialiser. Si vous faites référence à une variable qui n'a pas été initialisée, elle a une valeur NULLet un type de chaîne.

    SELECT @var_any_var_name

    Vous pouvez initialiser une variable à l'aide de SETou de l' SELECTinstruction:

    SET @start = 1, @finish = 10;    

    ou

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

    Les variables utilisateur peuvent se voir attribuer une valeur à partir d'un ensemble limité de types de données: entier, décimal, virgule flottante, chaîne binaire ou non binaire ou valeur NULL.

    Les variables définies par l'utilisateur sont spécifiques à la session. En d'autres termes, une variable utilisateur définie par un client ne peut pas être vue ou utilisée par d'autres clients.

    Ils peuvent être utilisés dans des SELECTrequêtes utilisant des techniques avancées de variable utilisateur MySQL .

  2. Variables locales (sans préfixe):

    Les variables locales doivent être déclarées en utilisant DECLAREavant d'y accéder.

    Ils peuvent être utilisés comme variables locales et paramètres d'entrée dans une procédure stockée:

    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 la DEFAULTclause est manquante, la valeur initiale est NULL.

    La portée d'une variable locale est le BEGIN ... ENDbloc dans lequel elle est déclarée.

  3. Variables système du serveur (préfixées par @@):

    Le serveur MySQL conserve de nombreuses variables système configurées sur une valeur par défaut. Ils peuvent être de type GLOBAL, SESSIONou BOTH.

    Les variables globales affectent le fonctionnement global du serveur tandis que les variables de session affectent son fonctionnement pour les connexions client individuelles.

    Pour voir les valeurs actuelles utilisées par un serveur en cours d'exécution, utilisez l' SHOW VARIABLESinstruction ou SELECT @@var_name.

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

    Ils peuvent être définis au démarrage du serveur à l'aide des options de la ligne de commande ou dans un fichier d'options. La plupart d'entre eux peuvent être modifiés dynamiquement pendant que le serveur fonctionne à l'aide de 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
la source
3
L' =opératrice n'a pas fonctionné pour moi. Cela a bien fonctionné lorsque j'ai utilisé l' :=opérateur.
divinedragon
24
=L'opérateur ne fonctionne que dans la SETclause. Pour attribuer une valeur à une variable dans la SELECTrequête, vous pouvez utiliser l' :=opérateur par exempleSELECT @start := 1
Omesh
2
Pouvez-vous préciser ce que cela signifie: "Pas besoin de déclarer les variables de session définies par l'utilisateur désignées par le préfixe @"?
billynoah
3
@billynoah Je suppose que cela signifie que les variables de session définies par l'utilisateur (qui commencent par @) n'ont pas besoin d'une déclaration explicite; vous pouvez simplement les affecter immédiatement comme s'ils avaient déjà été déclarés.
jobo3208
2
Et vous pouvez attribuer une variable avec le résultat d'une instruction select comme celle-ci: SET @subscriptionId = (select subscriptionId from User where emailAddress='[email protected] ');
Software Prophets
28

ENSEMBLE

SET @var_name = value 

OU

SET @var := value

les deux opérateurs = et : = sont acceptés


SÉLECTIONNER

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

si plusieurs jeux d'enregistrements trouvés, seule la dernière valeur dans col2 est keep (override);

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

dans ce cas, le résultat de select ne contient pas de valeurs col2


Ex les deux méthodes utilisées

- TRIGGER_BEFORE_INSERT --- définition d'une valeur de colonne à partir des calculs

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
bortunac
la source
3
Quelle est la difference entre =et :=?
Koray Tugay
2
Je suppose que pour mysql SELECT, la syntaxe est nécessaire pour séparer le sens de = (comparaison) de: = (asign)
bortunac
1
Dans certains cas, les valeurs laissées dans les variables peuvent NE PAS correspondre à la dernière ligne retournée. Par exemple, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10semble évaluer les affectations de variables avant que la commande ne soit effectuée, de sorte que la valeur renvoyée de @var ne puisse même pas être liée à l'une des lignes renvoyées. Cependant, les documents ne disent pas dans quelles conditions cela peut se produire.
Doin
15

Utilisez set ou select

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

exemple :

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

Différents types de variables:

  • les variables locales (qui ne sont pas préfixées par @) sont fortement typées et étendues au bloc de programme stocké dans lequel elles sont déclarées. Notez que, comme documenté sous DECLARE Syntax :

DECLARE n'est autorisé qu'à l'intérieur d'une instruction composée BEGIN ... END et doit être à son début, avant toute autre instruction.

  • Les variables utilisateur (préfixées par @) sont typées de manière lâche et étendues à la session. Notez qu'ils n'ont pas besoin ni ne peuvent être déclarés - utilisez-les directement.

Par conséquent, si vous définissez un programme stocké et souhaitez réellement une "variable locale", vous devrez supprimer le caractère @ et vous assurer que votre instruction DECLARE se trouve au début de votre bloc de programme. Sinon, pour utiliser une "variable utilisateur", supprimez l'instruction DECLARE.

De plus, vous devrez soit entourer votre requête entre parenthèses afin de l'exécuter en tant que sous-requête:

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

Ou bien, vous pouvez utiliser SELECT ... INTO:

SELECT COUNT (*) INTO @countTotal FROM nGrams;

mohammadAli
la source
1

Pour toute personne utilisant @variable dans la fonction concat_ws pour obtenir des valeurs concaténées, n'oubliez pas de la réinitialiser avec une valeur vide. Sinon, il peut utiliser l'ancienne valeur pour la même session.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
Imran Javed
la source
0
  • Déclarer: SET @a = 1;

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

yaya
la source
-3

Valeur SET

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