Bagaimana cara mendeklarasikan variabel di MySQL?

386

Bagaimana cara mendeklarasikan variabel dalam mysql, sehingga kueri kedua saya dapat menggunakannya?

Saya ingin menulis sesuatu seperti:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;
cdub
sumber
Jangan lupa Anda mungkin perlu "Izinkan Variabel Pengguna = Benar".
Steve Smith

Jawaban:

636

Ada terutama tiga jenis variabel di MySQL:

  1. Variabel yang ditentukan pengguna (diawali dengan @):

    Anda dapat mengakses variabel yang ditentukan pengguna tanpa mendeklarasikan atau menginisialisasi. Jika Anda merujuk ke variabel yang belum diinisialisasi, itu memiliki nilai NULLdan tipe string.

    SELECT @var_any_var_name

    Anda dapat menginisialisasi variabel menggunakan SETatau SELECTpernyataan:

    SET @start = 1, @finish = 10;    

    atau

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

    Variabel pengguna dapat diberi nilai dari sekumpulan tipe data terbatas: integer, desimal, floating-point, string biner atau non-biner, atau nilai NULL.

    Variabel yang ditentukan pengguna khusus untuk sesi. Yaitu, variabel pengguna yang ditentukan oleh satu klien tidak dapat dilihat atau digunakan oleh klien lain.

    Mereka dapat digunakan dalam SELECTkueri menggunakan teknik variabel pengguna MySQL Lanjut .

  2. Variabel Lokal (tanpa awalan):

    Variabel lokal perlu dideklarasikan menggunakan DECLAREsebelum mengaksesnya.

    Mereka dapat digunakan sebagai variabel lokal dan parameter input di dalam prosedur tersimpan:

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

    Jika DEFAULTklausa hilang, nilai awalnya adalah NULL.

    Ruang lingkup variabel lokal adalah BEGIN ... ENDblok di mana ia dideklarasikan.

  3. Variabel Sistem Server (diawali dengan @@):

    Server MySQL memelihara banyak variabel sistem yang dikonfigurasikan ke nilai default. Mereka bisa bertipe GLOBAL, SESSIONatau BOTH.

    Variabel global memengaruhi operasi server secara keseluruhan sedangkan variabel sesi memengaruhi operasinya untuk koneksi klien individual.

    Untuk melihat nilai saat ini yang digunakan oleh server yang berjalan, gunakan SHOW VARIABLESpernyataan atau SELECT @@var_name.

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

    Mereka dapat diatur pada permulaan server menggunakan opsi pada baris perintah atau dalam file opsi. Sebagian besar dari mereka dapat diubah secara dinamis saat server berjalan menggunakan SET GLOBALatau 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
sumber
3
Entah bagaimana =operator tidak bekerja untuk saya. Ini bekerja dengan baik ketika saya menggunakan :=operator.
divinedragon
24
=Operator hanya bekerja dalam SETklausa. Untuk menetapkan nilai ke variabel dalam SELECTkueri, Anda dapat menggunakan :=operator mis.SELECT @start := 1
Omesh
2
Bisakah Anda menjelaskan apa artinya ini: "Tidak perlu mendeklarasikan variabel Sesi yang Ditentukan Pengguna dilambangkan dengan awalan @"?
billynoah
3
@ billynoah Saya berasumsi itu berarti bahwa variabel Sesi yang Ditentukan Pengguna (yang dimulai dengan @) tidak perlu deklarasi eksplisit; Anda bisa langsung menugaskan mereka seolah-olah sudah diumumkan.
jobo3208
2
Dan Anda dapat menetapkan variabel dengan hasil pernyataan pilih seperti ini: SET @subscriptionId = (pilih berlanggananId dari Pengguna di mana emailAddress='[email protected] ');
Perangkat Lunak Prophets
28

SET

SET @var_name = value 

ATAU

SET @var := value

kedua operator = dan : = diterima


PILIH

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

jika beberapa set rekaman hanya ditemukan nilai terakhir di col2 adalah keep (override);

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

dalam hal ini hasil pilih tidak mengandung nilai col2


Mantan kedua metode yang digunakan

- TRIGGER_BEFORE_INSERT --- mengatur nilai kolom dari perhitungan

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...
bortunac
sumber
3
Apa perbedaan antara =dan :=?
Koray Tugay
2
Saya kira sintaks SELECT mysql diperlukan untuk memisahkan arti = (perbandingan) dari: = (asign)
bortunac
1
Dalam kasus tertentu, nilai yang tersisa di variabel mungkin TIDAK sesuai dengan baris terakhir yang dikembalikan. Sebagai contoh, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10muncul untuk mengevaluasi tugas variabel sebelum pesanan dilakukan, sehingga nilai yang dikembalikan dari @var bahkan mungkin tidak berhubungan dengan salah satu baris yang dikembalikan. Namun, dokumen tidak mengatakan dalam kondisi apa ini bisa terjadi.
Lakukan
15

Gunakan set atau pilih

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

contoh:

SELECT @price := MAX(product.price)
FROM product 
Mohammad Mahdi KouchakYazdi
sumber
3

Berbagai jenis variabel:

  • variabel lokal (yang tidak diawali oleh @) diketik dan dicakup dengan kuat ke blok program yang disimpan di mana mereka dideklarasikan. Perhatikan bahwa, sebagaimana didokumentasikan dalam DECLARE Syntax :

DECLARE hanya diizinkan di dalam BEGIN ... END pernyataan majemuk dan harus pada awalnya, sebelum pernyataan lainnya.

  • Variabel pengguna (yang diawali dengan @) diketik longgar dan dilingkupi untuk sesi. Perhatikan bahwa mereka tidak perlu atau tidak dapat dinyatakan — cukup gunakan secara langsung.

Oleh karena itu, jika Anda mendefinisikan program yang disimpan dan benar-benar menginginkan "variabel lokal", Anda harus menghapus karakter @ dan memastikan bahwa pernyataan DECLARE Anda ada di awal blok program Anda. Jika tidak, untuk menggunakan "variabel pengguna", jatuhkan pernyataan DECLARE.

Selain itu, Anda harus mengelilingi kueri Anda dalam tanda kurung untuk menjalankannya sebagai subquery:

SET @countTotal = (PILIH COUNT (*) DARI nGrams);

Atau yang lain, Anda bisa menggunakan SELECT ... KE:

PILIH COUNT (*) MENJADI @kountTotal DARI nGrams;

mohammadali
sumber
1

Untuk setiap orang yang menggunakan @variable di fungsi concat_ws untuk mendapatkan nilai yang digabungkan, jangan lupa untuk menginisialisasi ulang dengan nilai kosong. Kalau tidak, bisa menggunakan nilai lama untuk sesi yang sama.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;
Imran Javed
sumber
0
  • Menyatakan: SET @a = 1;

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

yaya
sumber
-3

Nilai SET

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Hari Lakkakula
sumber