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ść NULL
i typ ciągu.
SELECT @var_any_var_name
Możesz zainicjować zmienną za pomocą SET
lub SELECT
instrukcji:
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 SELECT
zapytaniach wykorzystujących zaawansowane techniki zmiennych użytkownika MySQL .
Zmienne lokalne (bez prefiksu):
Zmienne lokalne należy zadeklarować za pomocą DECLARE
przed 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 DEFAULT
brakuje klauzuli, wartością początkową jest NULL
.
Zakres zmiennej lokalnej to BEGIN ... END
blok, 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
, SESSION
lub 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 VARIABLES
instrukcji 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 GLOBAL
lub 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 SET
klauzuli. Do przypisania wartości zmiennej w SELECT
zapytaniu 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 10
wydaje 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 ;