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;
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;
Réponses:
Il existe principalement trois types de variables dans MySQL:
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 NULL
et un type de chaîne.
SELECT @var_any_var_name
Vous pouvez initialiser une variable à l'aide de SET
ou de l' SELECT
instruction:
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 SELECT
requêtes utilisant des techniques avancées de variable utilisateur MySQL .
Variables locales (sans préfixe):
Les variables locales doivent être déclarées en utilisant DECLARE
avant 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 DEFAULT
clause est manquante, la valeur initiale est NULL
.
La portée d'une variable locale est le BEGIN ... END
bloc dans lequel elle est déclarée.
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
, SESSION
ou 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 VARIABLES
instruction 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 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;
=
opératrice n'a pas fonctionné pour moi. Cela a bien fonctionné lorsque j'ai utilisé l' :=
opérateur.
=
L'opérateur ne fonctionne que dans la SET
clause. Pour attribuer une valeur à une variable dans la SELECT
requête, vous pouvez utiliser l' :=
opérateur par exempleSELECT @start := 1
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;
...
=
et :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
semble é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.
Utilisez set ou select
SET @counter := 100;
SELECT @variable_name := value;
exemple :
SELECT @price := MAX(product.price)
FROM product
Différents types de variables:
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.
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;
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;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;