Jak zadeklarować zmienną w MySQL?

386

Jak zadeklarować zmienną w mysql, aby moje drugie zapytanie mogło z niej korzystać?

Chciałbym napisać coś takiego:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
cdub
źródło
Nie zapomnij, że możesz potrzebować opcji „Zezwól na zmienne użytkownika = prawda”.
Steve Smith

Odpowiedzi:

636

Istnieją głównie trzy typy zmiennych w MySQL:

  1. Zmienne zdefiniowane przez użytkownika (z prefiksem @):

    Możesz uzyskać dostęp do dowolnej zmiennej zdefiniowanej przez użytkownika bez jej deklarowania lub inicjowania. Jeśli odwołujesz się do zmiennej, która nie została zainicjowana, ma ona wartość NULLi typ ciągu.

    SELECT @var_any_var_name

    Możesz zainicjować zmienną za pomocą SETlub SELECTinstrukcji:

    SET @start = 1, @finish = 10;    

    lub

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

    Zmiennym użytkownika można przypisać wartość z ograniczonego zestawu typów danych: liczba całkowita, dziesiętna, zmiennoprzecinkowa, ciąg binarny lub niebinarny lub wartość NULL.

    Zmienne zdefiniowane przez użytkownika są specyficzne dla sesji. Oznacza to, że zmienna użytkownika zdefiniowana przez jednego klienta nie może być widoczna ani używana przez innych klientów.

    Można ich używać w SELECTzapytaniach wykorzystujących zaawansowane techniki zmiennych użytkownika MySQL .

  2. Zmienne lokalne (bez prefiksu):

    Zmienne lokalne należy zadeklarować za pomocą DECLAREprzed uzyskaniem dostępu do nich.

    Mogą być używane jako zmienne lokalne i parametry wejściowe wewnątrz procedury składowanej:

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

    Jeśli DEFAULTbrakuje klauzuli, wartością początkową jest NULL.

    Zakres zmiennej lokalnej to BEGIN ... ENDblok, w którym jest deklarowany.

  3. Zmienne systemowe serwera (z prefiksem @@):

    Serwer MySQL utrzymuje wiele zmiennych systemowych skonfigurowanych na wartość domyślną. Mogą być typu GLOBAL, SESSIONlub BOTH.

    Zmienne globalne wpływają na ogólne działanie serwera, podczas gdy zmienne sesyjne wpływają na jego działanie dla indywidualnych połączeń klientów.

    Aby zobaczyć bieżące wartości używane przez działający serwer, użyj SHOW VARIABLESinstrukcji lub SELECT @@var_name.

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

    Można je ustawić przy uruchamianiu serwera za pomocą opcji w wierszu polecenia lub w pliku opcji. Większość z nich można zmieniać dynamicznie podczas działania serwera za pomocą SET GLOBALlub 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;
Omesh
źródło
3
Jakoś =operator nie działał dla mnie. Działało dobrze, gdy korzystałem z :=operatora.
divinedragon,
24
=operator działa tylko w SETklauzuli. Do przypisania wartości zmiennej w SELECTzapytaniu można użyć :=operatora np.SELECT @start := 1
Omesh
2
Czy możesz wyjaśnić, co to znaczy: „Nie trzeba deklarować zmiennych sesji zdefiniowanych przez użytkownika przedrostkiem @”?
billynoah,
3
@billynoah Zakładam, że oznacza to, że zmienne sesji zdefiniowane przez użytkownika (które zaczynają się od @) nie wymagają wyraźnej deklaracji; możesz przypisać je natychmiast, tak jakby już zostały zadeklarowane.
jobo3208
2
I możesz przypisać zmienną z wynikiem instrukcji select w następujący sposób: SET @subscriptionId = (wybierz identyfikator subskrypcji od użytkownika, gdzie emailAddress='[email protected] ');
Software Prorocy
28

ZESTAW

SET @var_name = value 

LUB

SET @var := value

oba operatory = i : = są akceptowane


WYBIERZ

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

jeśli znaleziono wiele zestawów rekordów, zachowana jest tylko ostatnia wartość w kolumnie 2 (przesłonięcie);

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

w tym przypadku wynik wyboru nie zawiera wartości col2


Z obu zastosowanych metod

- TRIGGER_BEFORE_INSERT --- ustawienie wartości kolumny na podstawie obliczeń

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
bortunac
źródło
3
Jaka jest różnica między =i :=?
Koray Tugay
2
Myślę, że dla mysql składnia SELECT jest konieczna do oddzielenia znaczenia = (porównanie) od: = (asign)
bortunac
1
W niektórych przypadkach wartości pozostawione w zmiennych NIE mogą odpowiadać ostatniemu zwracanemu wierszowi. Na przykład SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10wydaje się oceniać przypisania zmiennych przed zakończeniem sortowania, aby zwracana wartość @var mogła nawet nie odnosić się do żadnego ze zwracanych wierszy. Jednak doktorzy nie mówią, w jakich warunkach może się to zdarzyć.
Doin
15

Użyj ustaw lub wybierz

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

przykład:

SELECT @price := MAX(product.price)
FROM product 
Mohammad Mahdi KouchakYazdi
źródło
3

Różne typy zmiennych:

  • zmienne lokalne (które nie są poprzedzone @) są silnie typowane i obejmują zakres przechowywanego bloku programu, w którym zostały zadeklarowane. Zauważ, że zgodnie z dokumentacją w DECLARE Składnia :

DECLARE jest dozwolone tylko wewnątrz instrukcji złożonej BEGIN ... END i musi być na początku, przed innymi instrukcjami.

  • Zmienne użytkownika (które są poprzedzone przez @) są luźno wpisane i mają zakres do sesji. Pamiętaj, że nie potrzebują ani nie mogą być zadeklarowane - po prostu użyj ich bezpośrednio.

Dlatego, jeśli definiujesz zapisany program i naprawdę chcesz mieć „zmienną lokalną”, musisz usunąć znak @ i upewnić się, że instrukcja DECLARE znajduje się na początku bloku programu. W przeciwnym razie, aby użyć „zmiennej użytkownika”, upuść instrukcję DECLARE.

Ponadto musisz albo otoczyć zapytanie w nawiasach, aby wykonać je jako podzapytanie:

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

Albo możesz użyć SELECT ... INTO:

WYBIERZ LICZBA (*) NA @countTotal FROM nGrams;

mohammadAli
źródło
1

Dla każdej osoby używającej @variable w funkcji concat_ws w celu uzyskania połączonych wartości, nie zapomnij ponownie zainicjować jej z pustą wartością. W przeciwnym razie może użyć starej wartości dla tej samej sesji.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
Imran Javed
źródło
0
  • Ogłosić: SET @a = 1;

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

yaya
źródło
-3

Ustalić wartość

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Hari Lakkakula
źródło