Come dichiarare una variabile in MySQL?


386

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;

Non dimenticare che potresti aver bisogno di "Consenti variabili utente = Vero".
Steve Smith,

Risposte:


636

Esistono principalmente tre tipi di variabili in MySQL:

  1. 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 NULLe un tipo di stringa.

    SELECT @var_any_var_name

    Puoi inizializzare una variabile usando SETo l' SELECTistruzione:

    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 SELECTquery utilizzando tecniche variabili utente MySQL avanzate .

  2. Variabili locali (senza prefisso):

    Le variabili locali devono essere dichiarate utilizzando DECLAREprima 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 DEFAULTmanca la clausola, il valore iniziale è NULL.

    L'ambito di una variabile locale è il BEGIN ... ENDblocco all'interno del quale è dichiarata.

  3. 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, SESSIONo 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 VARIABLESistruzione 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 GLOBALo 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
In qualche modo l' =operatore non ha funzionato per me. Ha funzionato bene quando ho usato l' :=operatore.
divinedragon,

24
=l'operatore lavora solo nella SETclausola. Per assegnare valore a una variabile nella SELECTquery è possibile utilizzare l' :=operatore, ad esSELECT @start := 1
Omesh,

2
Potete chiarire cosa significa: "Non è necessario dichiarare le variabili di sessione definite dall'utente indicate con il prefisso @"?
Billynoah,

3
@billynoah Suppongo significhi che le variabili di sessione definite dall'utente (che iniziano con @) non necessitano di una dichiarazione esplicita; puoi semplicemente assegnargli immediatamente come se fossero già stati dichiarati.
jobo3208,

2
E puoi assegnare una variabile con il risultato di un'istruzione select come questa: SET @subscriptionId = (seleziona iscrizioneId da Utente dove emailAddress='ac@tmail.com ');
Software Prophets,

28

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

3
Qual è la differenza tra =e :=?
Koray Tugay,

2
Immagino che per mysql la sintassi SELECT sia necessaria per separare il significato di = (confronto) da: = (asign)
bortunac,

1
In alcuni casi, i valori lasciati nelle variabili potrebbero NON corrispondere all'ultima riga restituita. Ad esempio, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10sembra 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.
Doin

15

Usa set o seleziona

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

esempio :

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

3

Diversi tipi di variabili:

  • le variabili locali (che non sono precedute da @) sono fortemente tipizzate e definite nel blocco di programma memorizzato in cui sono dichiarate. Si noti che, come documentato in Sintassi DECLARE :

DECLARE è consentito solo all'interno di un'istruzione composta BEGIN ... END e deve essere all'inizio, prima di qualsiasi altra istruzione.

  • Le variabili utente (che sono precedute da @) sono tipizzate in modo approssimativo e nell'ambito della sessione. Nota che non hanno bisogno né possono essere dichiarati, basta usarli direttamente.

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;


1

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;

0
  • Dichiarare: SET @a = 1;

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


-3

Valore impostato

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.