Як оголосити змінну в mysql, щоб мій другий запит міг її використовувати?
Я хотів би написати щось на кшталт:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Як оголосити змінну в mysql, щоб мій другий запит міг її використовувати?
Я хотів би написати щось на кшталт:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Відповіді:
В MySQL в основному є три типи змінних:
Користувацькі змінні (з префіксом @
):
Ви можете отримати доступ до будь-якої визначеної користувачем змінної, не оголошуючи її та ініціалізуючи її. Якщо ви посилаєтесь на змінну, яка не була ініціалізована, вона має значення NULL
та тип рядка.
SELECT @var_any_var_name
Ви можете ініціалізувати змінну за допомогою SET
або SELECT
оператора:
SET @start = 1, @finish = 10;
або
SELECT @start := 1, @finish := 10;
SELECT * FROM places WHERE place BETWEEN @start AND @finish;
Користувацьким змінним може бути призначене значення з обмеженого набору типів даних: ціле число, десятковий знак, плаваюча точка, двійковий чи небінарний рядок або значення NULL.
Користувацькі змінні залежать від сеансу. Тобто, змінна користувача, визначена одним клієнтом, не може бачитись і не використовуватися іншими клієнтами.
Їх можна використовувати в SELECT
запитах, використовуючи розширені методи змінної користувача MySQL .
Локальні змінні (без префікса):
Локальні змінні повинні бути оголошені за допомогою, DECLARE
перш ніж отримати доступ до них.
Вони можуть використовуватися як локальні змінні та вхідні параметри всередині збереженої процедури:
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);
Якщо DEFAULT
пункт відсутній, початкове значення є NULL
.
Область локальної змінної - це BEGIN ... END
блок, в межах якого вона оголошена.
Змінні системи сервера (з префіксом @@
):
Сервер MySQL підтримує багато системних змінних, налаштованих на значення за замовчуванням. Вони можуть бути типу GLOBAL
, SESSION
або BOTH
.
Глобальні змінні впливають на загальну роботу сервера, тоді як змінні сеансу впливають на його роботу для окремих клієнтських з'єднань.
Щоб побачити поточні значення, використовувані запущеним сервером, використовуйте SHOW VARIABLES
оператор або SELECT @@var_name
.
SHOW VARIABLES LIKE '%wait_timeout%';
SELECT @@sort_buffer_size;
Їх можна встановити при запуску сервера, використовуючи параметри в командному рядку або у файлі опцій. Більшість з них можуть бути змінені динамічно в той час як сервер працює з використанням SET GLOBAL
або 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;
=
оператор не працював на мене. Це добре працювало, коли я використовував :=
оператора.
=
Оператор працює лише в SET
пункті. Для присвоєння значення змінній у SELECT
запиті ви можете скористатися :=
оператором, наприкладSELECT @start := 1
НАСТРОЙКА
SET @var_name = value
АБО
SET @var := value
обидва оператори = і : = приймаються
ВИБІРИ
SELECT col1, @var_name := col2 from tb_name WHERE "conditon";
якщо в кількох наборах записів знайдено лише останнє значення в Col2, зберігається (переосмислюється);
SELECT col1, col2 INTO @var_name, col3 FROM .....
в цьому випадку результат вибору не містить значень col2
Наприклад, обидва використовувані методи
- TRIGGER_BEFORE_INSERT --- встановлення значення стовпця з обчислень
...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL( @NR, 0 ) + 1;
...
=
і :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
з'являється оцінка оцінки змінних перед виконанням замовлення, так що повернене значення @var може навіть не стосуватися жодного з повернених рядків. Документи не кажуть, за яких умов це може статися.
Використовуйте набір або виберіть
SET @counter := 100;
SELECT @variable_name := value;
приклад:
SELECT @price := MAX(product.price)
FROM product
Різні типи змінної:
DECLARE дозволено лише всередині BEGIN ... END складеного оператора і має бути на його початку, перед будь-якими іншими операторами.
Тому, якщо ви визначаєте збережену програму і дійсно хочете "локальну змінну", вам потрібно буде скинути символ @ і переконатися, що ваш вислів DECLARE знаходиться на початку блоку програми. В іншому випадку, щоб використовувати "змінну користувача", скиньте оператор DECLARE.
Крім того, вам потрібно буде оточити ваш запит у дужках, щоб виконати його як підзапит:
SET @countTotal = (ВИБІРТЕ КОЛЕТ (*) ВІД nGrams);
Або ж ви можете використовувати SELECT ... INTO:
ВИБІРТЕ КУХНУ (*) INTO @countTotal ВІД nGrams;
Для будь-якої людини, яка використовує функцію @variable у concat_ws для отримання об'єднаних значень, не забудьте повторно ініціалізувати її із порожнім значенням. В іншому випадку він може використовувати старе значення для того ж сеансу.
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 ;