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;
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;
Antworten:
In MySQL gibt es hauptsächlich drei Arten von Variablen:
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 NULL
und den Typ einer Zeichenfolge.
SELECT @var_any_var_name
Sie können eine Variable mit SET
oder SELECT
Anweisung 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 SELECT
Abfragen mit Advanced MySQL-Benutzervariablentechniken verwendet werden .
Lokale Variablen (kein Präfix):
Lokale Variablen müssen mit deklariert werden, DECLARE
bevor 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 DEFAULT
Klausel fehlt, ist der Anfangswert NULL
.
Der Bereich einer lokalen Variablen ist der BEGIN ... END
Block, in dem sie deklariert ist.
Serversystemvariablen (mit dem Präfix @@
):
Der MySQL-Server verwaltet viele Systemvariablen, die auf einen Standardwert konfiguriert sind. Sie können vom Typ sein GLOBAL
, SESSION
oder 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 VARIABLES
Anweisung 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 GLOBAL
oder 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;
=
Operator bei mir nicht funktioniert. Es hat gut funktioniert, als ich :=
Operator verwendet habe.
=
Operator arbeitet nur in SET
Klausel. Um einer Variablen in der SELECT
Abfrage einen Wert :=
SELECT @start := 1
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;
...
=
und :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
scheint 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.
Verwenden Sie set oder select
SET @counter := 100;
SELECT @variable_name := value;
Beispiel:
SELECT @price := MAX(product.price)
FROM product
Verschiedene Arten von Variablen:
DECLARE ist nur innerhalb einer zusammengesetzten Anweisung BEGIN ... END zulässig und muss vor allen anderen Anweisungen am Anfang stehen.
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;
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;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;