Як оголосити змінну в MySQL?


386

Як оголосити змінну в mysql, щоб мій другий запит міг її використовувати?

Я хотів би написати щось на кшталт:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Не забувайте, що вам може знадобитися "Дозволити змінні користувача = Істинно".
Стів Сміт

Відповіді:


636

В MySQL в основному є три типи змінних:

  1. Користувацькі змінні (з префіксом @):

    Ви можете отримати доступ до будь-якої визначеної користувачем змінної, не оголошуючи її та ініціалізуючи її. Якщо ви посилаєтесь на змінну, яка не була ініціалізована, вона має значення 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 .

  2. Локальні змінні (без префікса):

    Локальні змінні повинні бути оголошені за допомогою, 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блок, в межах якого вона оголошена.

  3. Змінні системи сервера (з префіксом @@):

    Сервер 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;

3
Якось =оператор не працював на мене. Це добре працювало, коли я використовував :=оператора.
divinedragon

24
=Оператор працює лише в SETпункті. Для присвоєння значення змінній у SELECTзапиті ви можете скористатися :=оператором, наприкладSELECT @start := 1
Омеш,

2
Чи можете ви уточнити, що це означає: "Не потрібно оголошувати визначені користувачем змінні сесії, позначені префіксом @"?
billynoah

3
@billynoah Я припускаю, що це означає, що визначеним користувачем змінним сесії (які починаються з @) не потрібно явного оголошення; ви можете просто призначити їх негайно, як ніби вони вже були оголошені.
jobo3208

2
І ви можете призначити змінну з результатом оператора select на зразок цього: SET @subscriptionId = (виберіть subscriptionId від користувача, де emailAddress='ac@tmail.com ');
Програмне забезпечення Пророків

28

НАСТРОЙКА

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

3
У чому різниця між =і :=?
Корай Тугай

2
Я здогадуюсь, що для синтаксису mysql SELECT необхідно відокремити значення = (порівняння) від: = (призначити)
bortunac

1
У певних випадках значення, залишені у змінних, НЕ можуть відповідати останньому поверненому рядку. Наприклад, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10з'являється оцінка оцінки змінних перед виконанням замовлення, так що повернене значення @var може навіть не стосуватися жодного з повернених рядків. Документи не кажуть, за яких умов це може статися.
Doin


3

Різні типи змінної:

  • локальні змінні (які не мають префікса @), сильно набираються і привласнюються до збереженого програмного блоку, в якому вони оголошені. Зауважте, що, як це зафіксовано в синтаксисі DECLARE :

DECLARE дозволено лише всередині BEGIN ... END складеного оператора і має бути на його початку, перед будь-якими іншими операторами.

  • Користувацькі змінні (які мають префікс @) невільно вводяться та переходять до сеансу. Зауважте, що вони не потребують і не можуть бути заявлені - просто використовуйте їх безпосередньо.

Тому, якщо ви визначаєте збережену програму і дійсно хочете "локальну змінну", вам потрібно буде скинути символ @ і переконатися, що ваш вислів DECLARE знаходиться на початку блоку програми. В іншому випадку, щоб використовувати "змінну користувача", скиньте оператор DECLARE.

Крім того, вам потрібно буде оточити ваш запит у дужках, щоб виконати його як підзапит:

SET @countTotal = (ВИБІРТЕ КОЛЕТ (*) ВІД nGrams);

Або ж ви можете використовувати SELECT ... INTO:

ВИБІРТЕ КУХНУ (*) INTO @countTotal ВІД nGrams;


1

Для будь-якої людини, яка використовує функцію @variable у concat_ws для отримання об'єднаних значень, не забудьте повторно ініціалізувати її із порожнім значенням. В іншому випадку він може використовувати старе значення для того ж сеансу.

Set @Ids = '';

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

0
  • Заявити: SET @a = 1;

  • Використання: INSERT INTO `t` (`c`) VALUES (@a);


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.