Yanıtlar:
MySQL'de temel olarak üç değişken türü vardır:
Kullanıcı tanımlı değişkenler (ön ekli @
):
Herhangi bir kullanıcı tanımlı değişkeni bildirmeden veya başlatmadan erişebilirsiniz. Başlatılmamış bir değişkene başvurursanız, bir değeri NULL
ve bir dize türü vardır.
SELECT @var_any_var_name
Sen kullanarak bir değişkeni başlatabilir SET
veya SELECT
deyim:
SET @start = 1, @finish = 10;
veya
SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
Kullanıcı değişkenlerine sınırlı sayıda veri türünden bir değer atanabilir: tamsayı, ondalık, kayan nokta, ikili veya nonbinary dize veya NULL değer.
Kullanıcı tanımlı değişkenler oturuma özgüdür. Yani, bir istemci tarafından tanımlanan bir kullanıcı değişkeni diğer istemciler tarafından görülemez veya kullanılamaz.
Gelişmiş MySQL kullanıcı değişkeni teknikleri kullanılarak SELECT
sorgularda kullanılabilirler .
Yerel Değişkenler (önek yok):
Yerel değişkenlerin DECLARE
erişilmeden önce kullanılarak bildirilmesi gerekir.
Saklı yordamdaki yerel değişkenler ve giriş parametreleri olarak kullanılabilirler:
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);
Eğer DEFAULT
fıkra eksik, başlangıç değeridir NULL
.
Yerel bir değişkenin kapsamı, BEGIN ... END
içinde bildirildiği bloktur.
Sunucu Sistemi Değişkenleri (ön ekli @@
):
MySQL sunucusu , varsayılan bir değere yapılandırılmış birçok sistem değişkenini korur . Onlar türünde olabilir GLOBAL
, SESSION
ya da BOTH
.
Genel değişkenler sunucunun genel çalışmasını etkilerken, oturum değişkenleri bireysel istemci bağlantıları için çalışmasını etkiler.
Çalışan bir sunucu tarafından kullanılan geçerli değerleri görmek için SHOW VARIABLES
veya deyimini kullanın SELECT @@var_name
.
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
Bunlar, komut satırındaki seçenekler kullanılarak veya bir seçenek dosyasında sunucu başlangıcında ayarlanabilir. Çoğu sunucu SET GLOBAL
veya SET SESSION
aşağıdakileri kullanarak çalışırken dinamik olarak değiştirilebilir :
-- 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;
=
operatör benim için çalışmadı. :=
Operatörü kullandığımda iyi çalıştı .
=
operatörü yalnızca SET
yan tümcede çalışır . SELECT
Sorgudaki bir değişkene değer atamak için :=
operatörü kullanabilirsinizSELECT @start := 1
AYARLAMAK
SET @var_name = value
VEYA
SET @var := value
her iki operatör = ve : = kabul edilir
SEÇ
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
birden çok kayıt kümesi bulunursa, yalnızca col2'deki son değer korunur (geçersiz kıl);
SELECT col1, col2 INTO @var_name, col3 FROM .....
bu durumda seçim sonucu col2 değerleri içermez
Ex kullanılan her iki yöntem
- TRIGGER_BEFORE_INSERT --- hesaplamalardan sütun değeri ayarlama
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
=
ve :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
, değişken atamalarını sipariş tamamlanmadan önce değerlendiriyormuş gibi görünür, böylece @var'ın döndürülen değeri döndürülen satırların hiçbiriyle ilgili olmayabilir. Belgeler bunun hangi koşullar altında olabileceğini söylemiyor.
Kullan setini veya seçmek
SET @counter := 100;
SELECT @variable_name := value;
misal :
SELECT @price := MAX(product.price)
FROM product
Farklı değişken türleri:
DECLARE öğesine yalnızca bir BEGIN ... END bileşik ifadesi içinde izin verilir ve diğer ifadelerden önce başında olmalıdır.
Bu nedenle, depolanmış bir program tanımlıyorsanız ve aslında "yerel değişken" istiyorsanız, @ karakterini bırakmanız ve DECLARE ifadenizin program bloğunuzun başında olduğundan emin olmanız gerekir. Aksi takdirde, "kullanıcı değişkeni" kullanmak için DECLARE deyimini bırakın.
Ayrıca, bir alt sorgu olarak yürütmek için sorgunuzu parantez içine almanız gerekir:
SET @countTotal = (nGram'lardan COUNT (*) SEÇ);
Veya SELECT ... INTO kullanabilirsiniz:
COUNT (*) INTO @countTotal nGrams'dan;
Birleştirilmiş değerler elde etmek için concat_ws işlevinde @variable kullanan herhangi bir kişi için boş değerle yeniden başlatmayı unutmayın. Aksi takdirde aynı oturum için eski değeri kullanabilir.
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 ;