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;
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;
Câu trả lời:
Có ba loại biến chủ yếu trong MySQL:
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ị NULL
và 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 SET
hoặc SELECT
câ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 SELECT
cá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 .
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 DECLARE
trướ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 DEFAULT
mệnh đề bị thiếu, giá trị ban đầu là NULL
.
Phạm vi của một biến cục bộ là BEGIN ... END
khối trong đó nó được khai báo.
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
, SESSION
hoặ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 VARIABLES
câ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 GLOBAL
hoặ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;
=
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ử.
=
Toán tử chỉ hoạt động trong SET
mệnh đề. Để được chuyển nhượng giá trị cho một biến trong SELECT
truy vấn mà bạn có thể sử dụng :=
toán tử ví dụSELECT @start := 1
BỘ
SET @var_name = value
HOẶC LÀ
SET @var := value
cả hai toán tử = và : = đề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;
...
=
và là :=
gì?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
xuấ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ù.
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
Các loại biến khác nhau:
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.
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;
Đố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;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;