Come dichiarare una variabile in mysql, in modo che la mia seconda query possa usarla?
Vorrei scrivere qualcosa del tipo:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Come dichiarare una variabile in mysql, in modo che la mia seconda query possa usarla?
Vorrei scrivere qualcosa del tipo:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Risposte:
Esistono principalmente tre tipi di variabili in MySQL:
Variabili definite dall'utente (precedute da @
):
È possibile accedere a qualsiasi variabile definita dall'utente senza dichiararla o inizializzarla. Se si fa riferimento a una variabile che non è stata inizializzata, ha un valore NULL
e un tipo di stringa.
SELECT @var_any_var_name
Puoi inizializzare una variabile usando SET
o l' SELECT
istruzione:
SET @start = 1, @finish = 10;
o
SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
Alle variabili utente può essere assegnato un valore da un set limitato di tipi di dati: intero, decimale, virgola mobile, stringa binaria o non binaria o valore NULL.
Le variabili definite dall'utente sono specifiche della sessione. Ossia, una variabile utente definita da un client non può essere vista o utilizzata da altri client.
Possono essere utilizzati nelle SELECT
query utilizzando tecniche variabili utente MySQL avanzate .
Variabili locali (senza prefisso):
Le variabili locali devono essere dichiarate utilizzando DECLARE
prima di accedervi.
Possono essere utilizzati come variabili locali e parametri di input all'interno di una procedura memorizzata:
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);
Se DEFAULT
manca la clausola, il valore iniziale è NULL
.
L'ambito di una variabile locale è il BEGIN ... END
blocco all'interno del quale è dichiarata.
Variabili di sistema del server (con prefisso @@
):
Il server MySQL mantiene molte variabili di sistema configurate su un valore predefinito. Essi possono essere di tipo GLOBAL
, SESSION
o BOTH
.
Le variabili globali influenzano il funzionamento generale del server mentre le variabili di sessione influiscono sul suo funzionamento per le singole connessioni client.
Per visualizzare i valori correnti utilizzati da un server in esecuzione, utilizzare l' SHOW VARIABLES
istruzione o SELECT @@var_name
.
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
Possono essere impostati all'avvio del server utilizzando le opzioni sulla riga di comando o in un file di opzioni. La maggior parte di essi può essere modificata in modo dinamico mentre il server è in esecuzione utilizzando SET GLOBAL
o 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;
=
operatore non ha funzionato per me. Ha funzionato bene quando ho usato l' :=
operatore.
=
l'operatore lavora solo nella SET
clausola. Per assegnare valore a una variabile nella SELECT
query è possibile utilizzare l' :=
operatore, ad esSELECT @start := 1
IMPOSTATO
SET @var_name = value
O
SET @var := value
entrambi gli operatori = e : = sono accettati
SELEZIONARE
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
se vengono trovati più set di record, solo l'ultimo valore in col2 è keep (override);
SELECT col1, col2 INTO @var_name, col3 FROM .....
in questo caso il risultato di select non contiene valori col2
Ex entrambi i metodi utilizzati
- TRIGGER_BEFORE_INSERT --- impostazione di un valore di colonna dai calcoli
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
=
e :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
sembra valutare le assegnazioni delle variabili prima del completamento dell'ordine, in modo che il valore restituito di @var potrebbe non essere correlato a nessuna delle righe restituite. Tuttavia, i documenti non dicono in quali condizioni ciò può accadere.
Usa set o seleziona
SET @counter := 100;
SELECT @variable_name := value;
esempio :
SELECT @price := MAX(product.price)
FROM product
Diversi tipi di variabili:
DECLARE è consentito solo all'interno di un'istruzione composta BEGIN ... END e deve essere all'inizio, prima di qualsiasi altra istruzione.
Pertanto, se si sta definendo un programma memorizzato e si desidera effettivamente una "variabile locale", è necessario eliminare il carattere @ e assicurarsi che la propria dichiarazione DECLARE sia all'inizio del blocco di programma. In caso contrario, per utilizzare una "variabile utente", eliminare l'istruzione DECLARE.
Inoltre, dovrai racchiudere la query tra parentesi per eseguirla come una sottoquery:
SET @countTotal = (SELEZIONA COUNT (*) DA nGrammi);
Altrimenti, potresti usare SELECT ... INTO:
SELEZIONA COUNT (*) INTO @countTotal FROM nGrams;
Per chiunque utilizzi @variable nella funzione concat_ws per ottenere valori concatenati, non dimenticare di reinizializzarlo con un valore vuoto. Altrimenti può usare il vecchio valore per la stessa sessione.
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 ;