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;
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;
Odpowiedzi:
Istnieją głównie trzy typy zmiennych w MySQL:
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 .
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.
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;=operator nie działał dla mnie. Działało dobrze, gdy korzystałem z :=operatora.
=operator działa tylko w SETklauzuli. Do przypisania wartości zmiennej w SELECTzapytaniu można użyć :=operatora np.SELECT @start := 1
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;
...
=i :=?
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ć.
Użyj ustaw lub wybierz
SET @counter := 100;
SELECT @variable_name := value;
przykład:
SELECT @price := MAX(product.price)
FROM product
Różne typy zmiennych:
DECLARE jest dozwolone tylko wewnątrz instrukcji złożonej BEGIN ... END i musi być na początku, przed innymi instrukcjami.
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;
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;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;