Làm thế nào để khai báo một biến trong MySQL?


386

Làm thế nào để khai báo một biến trong mysql, để truy vấn thứ hai của tôi có thể sử dụng nó?

Tôi muốn viết một cái gì đó như:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Đừng quên bạn có thể cần "Cho phép biến người dùng = True".
Steve Smith

Câu trả lời:


636

Có ba loại biến chủ yếu trong MySQL:

  1. Các biến do người dùng xác định (có tiền tố là @):

    Bạn có thể truy cập bất kỳ biến do người dùng xác định mà không cần khai báo hoặc khởi tạo nó. Nếu bạn đề cập đến một biến chưa được khởi tạo, nó có giá trị NULLvà một loại chuỗi.

    SELECT @var_any_var_name

    Bạn có thể khởi tạo một biến bằng cách sử dụng SEThoặc SELECTcâu lệnh:

    SET @start = 1, @finish = 10;    

    hoặc là

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

    Biến người dùng có thể được chỉ định một giá trị từ một tập hợp các loại dữ liệu giới hạn: số nguyên, số thập phân, dấu phẩy động, chuỗi nhị phân hoặc chuỗi không nhị phân hoặc giá trị NULL.

    Các biến do người dùng định nghĩa là phiên cụ thể. Đó là, một biến người dùng được xác định bởi một khách hàng không thể được nhìn thấy hoặc sử dụng bởi các khách hàng khác.

    Chúng có thể được sử dụng trong SELECTcác truy vấn bằng cách sử dụng các kỹ thuật biến người dùng MySQL nâng cao .

  2. Biến cục bộ (không có tiền tố):

    Các biến cục bộ cần được khai báo bằng cách sử dụng DECLAREtrước khi truy cập nó.

    Chúng có thể được sử dụng như các biến cục bộ và các tham số đầu vào bên trong một thủ tục được lưu trữ:

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

    Nếu DEFAULTmệnh đề bị thiếu, giá trị ban đầu là NULL.

    Phạm vi của một biến cục bộ là BEGIN ... ENDkhối trong đó nó được khai báo.

  3. Biến hệ thống máy chủ (có tiền tố @@):

    Máy chủ MySQL duy trì nhiều biến hệ thống được cấu hình thành một giá trị mặc định. Họ có thể là loại GLOBAL, SESSIONhoặc BOTH.

    Các biến toàn cục ảnh hưởng đến hoạt động chung của máy chủ trong khi các biến phiên ảnh hưởng đến hoạt động của nó đối với các kết nối máy khách riêng lẻ.

    Để xem các giá trị hiện tại được sử dụng bởi một máy chủ đang chạy, hãy sử dụng SHOW VARIABLEScâu lệnh hoặc SELECT @@var_name.

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

    Chúng có thể được đặt khi máy chủ khởi động bằng các tùy chọn trên dòng lệnh hoặc trong tệp tùy chọn. Hầu hết trong số chúng có thể được thay đổi linh hoạt trong khi máy chủ đang chạy bằng SET GLOBALhoặc 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;

3
Bằng cách nào đó, =nhà điều hành đã không làm việc cho tôi. Nó hoạt động tốt khi tôi sử dụng :=toán tử.
divinedragon

24
=Toán tử chỉ hoạt động trong SETmệnh đề. Để được chuyển nhượng giá trị cho một biến trong SELECTtruy vấn mà bạn có thể sử dụng :=toán tử ví dụSELECT @start := 1
Omesh

2
Bạn có thể vui lòng làm rõ điều này có nghĩa là gì: "Không cần khai báo các biến Phiên do người dùng xác định được biểu thị bằng tiền tố @"?
billynoah

3
@billynoah Tôi cho rằng điều đó có nghĩa là các biến Phiên do người dùng xác định (bắt đầu bằng @) không cần khai báo rõ ràng; bạn có thể chỉ định cho họ ngay lập tức như thể họ đã được khai báo.
jobo3208

2
Và bạn có thể chỉ định một biến với kết quả của một câu lệnh chọn như thế này: SET @subcripId = (chọn scribeId từ Người dùng nơi emailAddress='ac@tmail.com ');
Tiên tri phần mềm

28

BỘ

SET @var_name = value 

HOẶC LÀ

SET @var := value

cả hai toán tử =: = đều được chấp nhận


LỰA CHỌN

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

nếu nhiều bộ bản ghi chỉ tìm thấy giá trị cuối cùng trong col2 được giữ (ghi đè);

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

trong trường hợp này, kết quả của lựa chọn không chứa giá trị col2


Ex cả hai phương thức được sử dụng

- TRIGGER_BEFORE_INSERT --- đặt giá trị cột từ các phép tính

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col =  IFNULL( @NR, 0 ) + 1;
...

3
Sự khác biệt giữa =và là :=gì?
Koray Tugay

2
Tôi đoán rằng đối với cú pháp mysql SELECT là cần thiết để tách ý nghĩa của = (so sánh) khỏi: = (
asign

1
Trong một số trường hợp nhất định, các giá trị còn lại trong các biến có thể KHÔNG tương ứng với hàng cuối cùng được trả về. Ví dụ: SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10xuất hiện để đánh giá các phép gán biến trước khi thực hiện theo thứ tự, do đó giá trị trả về của @var thậm chí có thể không liên quan đến bất kỳ hàng nào được trả về. Các tài liệu không nói trong những điều kiện điều này có thể xảy ra, mặc dù.
Doin

15

Sử dụng thiết lập hoặc chọn

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

thí dụ :

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

3

Các loại biến khác nhau:

  • các biến cục bộ (không có tiền tố @) được gõ mạnh và nằm trong khối chương trình được lưu trữ trong đó chúng được khai báo. Lưu ý rằng, như được ghi lại trong Cú pháp DECLARE :

DECLARE chỉ được phép bên trong câu lệnh BEGIN ... END và phải bắt đầu trước bất kỳ câu lệnh nào khác.

  • Các biến người dùng (được tiền tố bởi @) được gõ lỏng lẻo và nằm trong phạm vi phiên. Lưu ý rằng họ không cần và cũng không thể khai báo chỉ cần sử dụng chúng trực tiếp.

Do đó, nếu bạn đang xác định chương trình được lưu trữ và thực sự muốn có "biến cục bộ", bạn sẽ cần bỏ ký tự @ và đảm bảo rằng câu lệnh DECLARE của bạn nằm ở đầu khối chương trình. Mặt khác, để sử dụng "biến người dùng", hãy bỏ câu lệnh DECLARE.

Hơn nữa, bạn sẽ cần phải bao quanh truy vấn của mình trong ngoặc đơn để thực thi nó dưới dạng truy vấn con:

SET @countTotal = (CHỌN COUNT (*) TỪ nGrams);

Hoặc nếu không, bạn có thể sử dụng CHỌN ... VÀO:

CHỌN COUNT (*) VÀO @countTotal TỪ nGrams;


1

Đối với bất kỳ người nào sử dụng @variable trong hàm concat_ws để nhận các giá trị được nối, đừng quên xác định lại nó với giá trị trống. Nếu không, nó có thể sử dụng giá trị cũ cho cùng một phiên.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;

0
  • Khai báo: SET @a = 1;

  • Sử dụng: INSERT INTO `t` (`c`) VALUES (@a);


-3

Đặt giá trị

 declare Regione int;   
 set Regione=(select  id from users
 where id=1) ;
 select Regione ;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.