MySQL'de bir değişken nasıl bildirilir?


386

Nasıl benim ikinci sorgu kullanabilirsiniz, mysql bir değişken bildirmek için?

Gibi bir şey yazmak istiyorum:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Unutmayın "Kullanıcı Değişkenlerine İzin Ver = Doğru".
Steve Smith

Yanıtlar:


636

MySQL'de temel olarak üç değişken türü vardır:

  1. 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 NULLve bir dize türü vardır.

    SELECT @var_any_var_name

    Sen kullanarak bir değişkeni başlatabilir SETveya SELECTdeyim:

    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 SELECTsorgularda kullanılabilirler .

  2. Yerel Değişkenler (önek yok):

    Yerel değişkenlerin DECLAREeriş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 DEFAULTfıkra eksik, başlangıç değeridir NULL.

    Yerel bir değişkenin kapsamı, BEGIN ... ENDiçinde bildirildiği bloktur.

  3. 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, SESSIONya 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 VARIABLESveya 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 GLOBALveya SET SESSIONaş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;
    

3
Bir şekilde =operatör benim için çalışmadı. :=Operatörü kullandığımda iyi çalıştı .
divinedragon

24
=operatörü yalnızca SETyan tümcede çalışır . SELECTSorgudaki bir değişkene değer atamak için :=operatörü kullanabilirsinizSELECT @start := 1
Omesh

2
Bunun ne anlama geldiğini açıklığa kavuşturabilir misiniz: "@ öneki ile belirtilen Kullanıcı Tanımlı Oturum değişkenlerini bildirmeye gerek yok"?
billynoah

3
@billynoah Kullanıcı Tanımlı Oturum değişkenlerinin (@ ile başlayan) açık bir bildirime ihtiyaç duymadığını varsayıyorum; onlara önceden bildirilmiş gibi hemen atayabilirsiniz.
22bo15

2
Ve bunun gibi bir select deyiminin sonucunu içeren bir değişken atayabilirsiniz: SET @subscriptionId = (emailAddress='ac@tmail.com 'Kullanıcısından abonelik kimliği seçin);
Yazılım Peygamberleri

28

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

3
Arasındaki fark nedir =ve :=?
Koray Tugay

2
Ben mysql SELECT sözdizimi için = (karşılaştırma) anlamını: = (asign)
bortunac 30:17

1
Bazı durumlarda, değişkenlerde kalan değerler döndürülen son satıra uygun DEĞİLDİR. Örneğin 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.
Doin

15

Kullan setini veya seçmek

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

misal :

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

3

Farklı değişken türleri:

  • Yerel değişkenler (@ ile önek olarak belirtilmez) güçlü bir şekilde yazılır ve bildirildikleri kaydedilmiş program bloğuna dahil edilir. DECLARE Sözdizimi altında belgelendiği gibi :

DECLARE öğesine yalnızca bir BEGIN ... END bileşik ifadesi içinde izin verilir ve diğer ifadelerden önce başında olmalıdır.

  • Kullanıcı değişkenleri (@ ile öneklidir) gevşek bir şekilde yazılır ve oturuma dahil edilir. İhtiyaç duymadıklarını veya beyan edilebileceklerini unutmayın; bunları doğrudan kullanın.

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;


1

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;

0
  • Bildirmek: SET @a = 1;

  • Kullanımı: INSERT INTO `t` (`c`) VALUES (@a);


-3

SET Değeri

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.