Difference between DECLARE and SET in SQL
SQL Variables: Understanding DECLARE vs. SET in MySQL

Explore the fundamental differences between DECLARE and SET for variable assignment in SQL, focusing on their scope, usage, and best practices in MySQL.
In SQL, particularly within MySQL, managing variables is a common task for storing temporary values, controlling flow, or simplifying complex queries. Two primary commands for variable handling are DECLARE
and SET
. While both are used to assign values to variables, they operate under different contexts and have distinct implications for variable scope and lifecycle. Understanding these differences is crucial for writing efficient, readable, and error-free SQL code.
The Role of DECLARE: Stored Program Variables
DECLARE
is used to define local variables within stored programs like stored procedures, functions, triggers, or events. These variables are strictly scoped to the block in which they are declared, meaning they exist only for the duration of that specific program execution. They are typically used for temporary storage, loop counters, or holding intermediate results within the program's logic.
DELIMITER //
CREATE PROCEDURE CalculateTotal(IN itemPrice DECIMAL(10, 2), IN quantity INT)
BEGIN
DECLARE totalAmount DECIMAL(10, 2);
SET totalAmount = itemPrice * quantity;
SELECT totalAmount AS 'Calculated Total';
END //
DELIMITER ;
CALL CalculateTotal(19.99, 5);
Example of DECLARE within a MySQL stored procedure
flowchart TD A[Stored Program Start] --> B{"DECLARE variable"} B --> C[Variable exists within program scope] C --> D[SET variable value] D --> E[Use variable in logic] E --> F[Stored Program End] F --> G[Variable is deallocated]
Lifecycle of a DECLAREd variable
The Role of SET: Session and User-Defined Variables
SET
is a more versatile command used for assigning values to user-defined variables (also known as session variables) or system variables. User-defined variables, prefixed with @
, have a session-level scope. This means they persist for the entire duration of the current client connection (session) and can be accessed from any query or statement within that session. They are ideal for passing values between different statements or for storing configuration settings for a session.
SET @myVariable = 'Hello SQL';
SELECT @myVariable;
SET @counter = 0;
UPDATE products SET stock = stock - 1 WHERE product_id = 101;
SET @counter = @counter + 1;
SELECT @counter AS 'Updates Made';
Examples of SET for user-defined variables
flowchart TD A[Client Connects] --> B{"SET @variable"} B --> C[Variable exists for session] C --> D[Access @variable in any query] D --> E[SET @variable again (reassign)] E --> F[Client Disconnects] F --> G[Variable is deallocated]
Lifecycle of a SET user-defined variable
Key Differences and When to Use Which
The fundamental distinction lies in their scope and purpose. DECLARE
creates variables that are local to a stored program block, ensuring they don't interfere with other parts of your session or application. SET
creates session-level variables that can be accessed globally within your current connection, making them useful for temporary data sharing across multiple statements. Choosing the right command depends entirely on where and how long you need your variable to persist.
DECLARE
for variables within stored procedures and functions. This practice promotes encapsulation and prevents unintended side effects from session-level variables.DECLARE Characteristics
- Scope: Local to the stored program (procedure, function, trigger, event).
- Syntax:
DECLARE variable_name data_type [DEFAULT value];
- Lifetime: Exists only for the duration of the stored program's execution.
- Usage: Temporary storage, loop counters, intermediate calculations within a program.
- Prefix: No special prefix required for the variable name.
SET Characteristics
- Scope: Session-level (user-defined variables) or global/session (system variables).
- Syntax:
SET @variable_name = value;
orSET GLOBAL/SESSION system_variable = value;
- Lifetime: User-defined variables persist until the session ends or they are explicitly unset/reassigned.
- Usage: Passing values between statements, storing session-specific settings, debugging.
- Prefix: User-defined variables require an
@
prefix (e.g.,@my_var
).
In summary, while both DECLARE
and SET
are variable assignment mechanisms in MySQL, they serve different architectural purposes. DECLARE
is for internal, localized variable management within stored routines, promoting modularity and preventing conflicts. SET
is for broader, session-wide variable management, enabling dynamic data flow across multiple SQL statements within a single connection. Understanding this distinction is key to writing robust and maintainable SQL.