Wie deklariere ich eine Variable in MySQL?


386

Wie deklariere ich eine Variable in MySQL, damit meine zweite Abfrage sie verwenden kann?

Ich möchte etwas schreiben wie:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Vergessen Sie nicht, dass Sie möglicherweise "Benutzervariablen zulassen = True" benötigen.
Steve Smith

Antworten:


636

In MySQL gibt es hauptsächlich drei Arten von Variablen:

  1. Benutzerdefinierte Variablen (mit dem Präfix @):

    Sie können auf jede benutzerdefinierte Variable zugreifen, ohne sie zu deklarieren oder zu initialisieren. Wenn Sie auf eine Variable verweisen, die nicht initialisiert wurde, hat sie den Wert NULLund den Typ einer Zeichenfolge.

    SELECT @var_any_var_name

    Sie können eine Variable mit SEToder SELECTAnweisung initialisieren :

    SET @start = 1, @finish = 10;    

    oder

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

    Benutzervariablen kann ein Wert aus einer begrenzten Anzahl von Datentypen zugewiesen werden: Ganzzahl, Dezimalzahl, Gleitkomma, binäre oder nicht-binäre Zeichenfolge oder NULL-Wert.

    Benutzerdefinierte Variablen sind sitzungsspezifisch. Das heißt, eine von einem Client definierte Benutzervariable kann von anderen Clients nicht gesehen oder verwendet werden.

    Sie können in SELECTAbfragen mit Advanced MySQL-Benutzervariablentechniken verwendet werden .

  2. Lokale Variablen (kein Präfix):

    Lokale Variablen müssen mit deklariert werden, DECLAREbevor auf sie zugegriffen werden kann.

    Sie können als lokale Variablen und Eingabeparameter innerhalb einer gespeicherten Prozedur verwendet werden:

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

    Wenn die DEFAULTKlausel fehlt, ist der Anfangswert NULL.

    Der Bereich einer lokalen Variablen ist der BEGIN ... ENDBlock, in dem sie deklariert ist.

  3. Serversystemvariablen (mit dem Präfix @@):

    Der MySQL-Server verwaltet viele Systemvariablen, die auf einen Standardwert konfiguriert sind. Sie können vom Typ sein GLOBAL, SESSIONoder BOTH.

    Globale Variablen wirken sich auf den Gesamtbetrieb des Servers aus, während Sitzungsvariablen den Betrieb für einzelne Clientverbindungen beeinflussen.

    Verwenden Sie die SHOW VARIABLESAnweisung oder , um die aktuellen Werte anzuzeigen, die von einem laufenden Server verwendet werden SELECT @@var_name.

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

    Sie können beim Serverstart mithilfe von Optionen in der Befehlszeile oder in einer Optionsdatei festgelegt werden. Die meisten von ihnen können dynamisch geändert werden, während der Server ausgeführt wird mit SET GLOBALoder 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;

3
Irgendwie hat der =Operator bei mir nicht funktioniert. Es hat gut funktioniert, als ich :=Operator verwendet habe.
Divinedragon

24
=Operator arbeitet nur in SETKlausel. Um einer Variablen in der SELECTAbfrage einen Wert :=SELECT @start := 1
zuzuweisen,

2
Können Sie bitte klarstellen, was dies bedeutet: "Benutzerdefinierte Sitzungsvariablen, die mit dem Präfix @ gekennzeichnet sind, müssen nicht deklariert werden"?
Billynoah

3
@billynoah Ich gehe davon aus, dass benutzerdefinierte Sitzungsvariablen (die mit @ beginnen) keine explizite Deklaration benötigen. Sie können sie einfach sofort zuweisen, als ob sie bereits deklariert worden wären.
Jobo3208

2
Und Sie können eine Variable mit dem Ergebnis einer select-Anweisung wie folgt zuweisen: SET @subscriptionId = (Wählen Sie die SubscriptionId unter User aus, wobei emailAddress='ac@tmail.com ');
Software Prophets

28

EINSTELLEN

SET @var_name = value 

ODER

SET @var := value

beide Operatoren = und : = werden akzeptiert


WÄHLEN

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

Wenn mehrere Datensätze gefunden wurden, wird nur der letzte Wert in Spalte 2 beibehalten (überschreiben).

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

In diesem Fall enthält das Ergebnis von select keine col2-Werte


Ex beide Methoden verwendet

- TRIGGER_BEFORE_INSERT --- Festlegen eines Spaltenwerts aus Berechnungen

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...

3
Was ist der Unterschied zwischen =und :=?
Koray Tugay

2
Ich denke, dass für mysql die SELECT-Syntax notwendig ist, um die Bedeutung von = (Vergleich) von zu trennen: = (asign)
bortunac

1
In bestimmten Fällen entsprechen die in Variablen verbleibenden Werte möglicherweise NICHT der zuletzt zurückgegebenen Zeile. Es SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10scheint beispielsweise, als würden die Variablenzuweisungen vor Abschluss der Bestellung ausgewertet, sodass sich der zurückgegebene Wert von @var möglicherweise nicht einmal auf eine der zurückgegebenen Zeilen bezieht. Die Dokumente sagen jedoch nicht, unter welchen Bedingungen dies passieren kann.
Doin

15

Verwenden Sie set oder select

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

Beispiel:

SELECT @price := MAX(product.price)
FROM product 

3

Verschiedene Arten von Variablen:

  • Lokale Variablen (denen kein @ vorangestellt ist) sind stark typisiert und auf den gespeicherten Programmblock beschränkt, in dem sie deklariert sind. Beachten Sie, dass, wie unter DECLARE-Syntax dokumentiert :

DECLARE ist nur innerhalb einer zusammengesetzten Anweisung BEGIN ... END zulässig und muss vor allen anderen Anweisungen am Anfang stehen.

  • Benutzervariablen (denen @ vorangestellt ist) werden lose eingegeben und auf die Sitzung beschränkt. Beachten Sie, dass sie weder benötigt noch deklariert werden können - verwenden Sie sie einfach direkt.

Wenn Sie ein gespeichertes Programm definieren und tatsächlich eine "lokale Variable" möchten, müssen Sie daher das @ -Zeichen löschen und sicherstellen, dass sich Ihre DECLARE-Anweisung am Anfang Ihres Programmblocks befindet. Andernfalls löschen Sie die DECLARE-Anweisung, um eine "Benutzervariable" zu verwenden.

Darüber hinaus müssen Sie Ihre Abfrage entweder in Klammern setzen, um sie als Unterabfrage auszuführen:

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

Oder Sie könnten SELECT verwenden ... INTO:

SELECT COUNT (*) IN @countTotal FROM nGrams;


1

Vergessen Sie nicht, Personen, die @variable in der Funktion concat_ws verwenden, um verkettete Werte abzurufen, mit einem leeren Wert neu zu initialisieren. Andernfalls kann der alte Wert für dieselbe Sitzung verwendet werden.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;

0
  • Erklären: SET @a = 1;

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


-3

SET Wert

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.