-- Create a database
CREATE DATABASE dbname;
-- Use a database
USE dbname;
-- Drop a database
DROP DATABASE dbname;
-- Create a table
CREATE TABLE tablename (
id INT PRIMARY KEY AUTO_INCREMENT,
column1 VARCHAR(255) NOT NULL,
column2 INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Show tables
SHOW TABLES;
-- Describe table structure
DESCRIBE tablename;
-- Drop a table
DROP TABLE tablename;
-- Alter a table
ALTER TABLE tablename ADD column3 DATE;
ALTER TABLE tablename MODIFY column1 VARCHAR(100);
ALTER TABLE tablename DROP COLUMN column2;
-- Insert data
INSERT INTO tablename (column1, column2) VALUES ('value1', 123);
-- Insert multiple rows
INSERT INTO tablename (column1, column2) VALUES ('value1', 123), ('value2', 456);
-- Select data
SELECT * FROM tablename;
SELECT column1, column2 FROM tablename WHERE column2 > 100 ORDER BY column1 DESC LIMIT 10;
-- Update data
UPDATE tablename SET column1 = 'newvalue' WHERE id = 1;
-- Delete data
DELETE FROM tablename WHERE id = 1;
-- WHERE clause
SELECT * FROM tablename WHERE column1 = 'value';
-- ORDER BY clause
SELECT * FROM tablename ORDER BY column1 ASC, column2 DESC;
-- LIMIT clause
SELECT * FROM tablename LIMIT 5 OFFSET 10;
-- GROUP BY and HAVING
SELECT column1, COUNT(*) FROM tablename GROUP BY column1 HAVING COUNT(*) > 1;
-- INNER JOIN
SELECT a.*, b.* FROM tableA a INNER JOIN tableB b ON a.id = b.a_id;
-- LEFT JOIN
SELECT a.*, b.* FROM tableA a LEFT JOIN tableB b ON a.id = b.a_id;
-- RIGHT JOIN
SELECT a.*, b.* FROM tableA a RIGHT JOIN tableB b ON a.id = b.a_id;
-- Create index
CREATE INDEX idx_column1 ON tablename (column1);
-- Drop index
DROP INDEX idx_column1 ON tablename;
-- Create user
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
-- Grant privileges
GRANT ALL PRIVILEGES ON dbname.* TO 'username'@'localhost';
-- Revoke privileges
REVOKE ALL PRIVILEGES ON dbname.* FROM 'username'@'localhost';
-- Show users
SELECT user, host FROM mysql.user;
-- Show databases
SHOW DATABASES;
-- Show columns
SHOW COLUMNS FROM tablename;
-- Show current database
SELECT DATABASE();
-- Show current user
SELECT USER();
MySQL supports two main types of variables: user-defined variables and system variables. User-defined variables are session-specific and can be used to store temporary values, while system variables control the operation of the MySQL server.
- User-defined variables are prefixed with
@
and exist for the duration of the session. - They can be assigned and used in SQL statements.
-- Assign a value using SET
SET @myvar = 10;
-- Assign a value using SELECT
SELECT @myvar := 20;
-- Assign from a query result
SELECT column1 INTO @myvar FROM mytable WHERE id = 1;
-- Use in expressions
SELECT @myvar + 5 AS result;
-- Use in WHERE clause
SELECT * FROM mytable WHERE id = @myvar;
-- Use in UPDATE
UPDATE mytable SET column1 = @myvar WHERE id = 2;
-- Assign a single value
SELECT column1 INTO @myvar FROM mytable WHERE id = 1;
-- Assign multiple values
SELECT column1, column2 INTO @var1, @var2 FROM mytable WHERE id = 1;
-- Example in a stored procedure
DELIMITER //
CREATE PROCEDURE example_proc()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE val INT;
DECLARE cur CURSOR FOR SELECT id FROM mytable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO val;
IF done THEN
LEAVE read_loop;
END IF;
-- Use variable val here
UPDATE mytable SET processed = 1 WHERE id = val;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
-- Use variable in INSERT
INSERT INTO mytable (column1) VALUES (@myvar);
-- Use variable in UPDATE
UPDATE mytable SET column1 = @myvar WHERE id = 1;
- MySQL does not support using variables directly as table or column names in static SQL.
- To use variables for table names, you must use prepared statements (dynamic SQL).
-- Example: Dynamic table name with prepared statement
SET @table = 'mytable';
SET @sql = CONCAT('SELECT * FROM ', @table, ' WHERE id = 1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @tablename = 'new_table';
SET @sql = CONCAT('CREATE TABLE ', @tablename, ' (id INT PRIMARY KEY, name VARCHAR(50))');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @tablename = 'mytable';
SET @sql = CONCAT('INSERT INTO ', @tablename, ' (column1) VALUES (123)');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
- Local variables are declared with
DECLARE
and only exist within stored procedures, functions, or triggers.
-- Declare and use local variable in a procedure
DELIMITER //
CREATE PROCEDURE local_var_example()
BEGIN
DECLARE counter INT DEFAULT 0;
SET counter = counter + 1;
SELECT counter;
END //
DELIMITER ;
- System variables control server operation.
- Global variables:
@@global.var_name
- Session variables:
@@session.var_name
or just@@var_name
-- View all system variables
SHOW VARIABLES;
-- View a specific variable
SHOW VARIABLES LIKE 'max_connections';
-- Set a session variable
SET SESSION sql_mode = 'TRADITIONAL';
-- Set a global variable (requires privileges)
SET GLOBAL max_connections = 200;
- User-defined variables are case-insensitive.
- Local variables (in stored programs) are case-sensitive.
- User-defined variables can be used in most SQL statements, but not as identifiers (table/column names) without dynamic SQL.
- Always use
DEALLOCATE PREPARE
after using prepared statements to free resources.
MySQL provides a wide range of functions and operations for working with dates and times. Below are commonly used examples for manipulating, formatting, and calculating with date and time values.
SELECT NOW(); -- Current date and time (YYYY-MM-DD HH:MM:SS)
SELECT CURDATE(); -- Current date (YYYY-MM-DD)
SELECT CURTIME(); -- Current time (HH:MM:SS)
SELECT UTC_DATE(); -- Current UTC date
SELECT UTC_TIME(); -- Current UTC time
SELECT UTC_TIMESTAMP(); -- Current UTC date and time
SELECT YEAR(NOW()); -- Year (e.g., 2025)
SELECT MONTH(NOW()); -- Month (1-12)
SELECT DAY(NOW()); -- Day of month (1-31)
SELECT HOUR(NOW()); -- Hour (0-23)
SELECT MINUTE(NOW()); -- Minute (0-59)
SELECT SECOND(NOW()); -- Second (0-59)
SELECT DAYOFWEEK(NOW()); -- Day of week (1=Sunday, 7=Saturday)
SELECT DAYOFYEAR(NOW()); -- Day of year (1-366)
SELECT WEEK(NOW()); -- Week number (0-53)
SELECT QUARTER(NOW()); -- Quarter (1-4)
SELECT DATE(NOW()); -- Date part only
SELECT TIME(NOW()); -- Time part only
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2025-07-23
SELECT DATE_FORMAT(NOW(), '%W, %M %e, %Y'); -- Wednesday, July 23, 2025
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 14:35:00
SELECT TIME_FORMAT(NOW(), '%h:%i %p'); -- 02:35 PM
SELECT STR_TO_DATE('23-07-2025', '%d-%m-%Y'); -- 2025-07-23
SELECT STR_TO_DATE('07/23/25', '%m/%d/%y'); -- 2025-07-23
-- Add days, months, years, etc.
SELECT DATE_ADD('2025-07-23', INTERVAL 10 DAY); -- 2025-08-02
SELECT DATE_ADD('2025-07-23', INTERVAL 2 MONTH); -- 2025-09-23
SELECT DATE_ADD('2025-07-23 10:00:00', INTERVAL 3 HOUR); -- 2025-07-23 13:00:00
-- Subtract days, months, years, etc.
SELECT DATE_SUB('2025-07-23', INTERVAL 5 DAY); -- 2025-07-18
SELECT DATE_SUB('2025-07-23', INTERVAL 1 YEAR); -- 2024-07-23
-- Add or subtract using arithmetic
SELECT '2025-07-23' + INTERVAL 1 DAY; -- 2025-07-24
SELECT '2025-07-23' - INTERVAL 1 MONTH; -- 2025-06-23
SELECT DATEDIFF('2025-08-01', '2025-07-23'); -- 9 (days)
SELECT TIMESTAMPDIFF(DAY, '2025-07-23', '2025-08-01'); -- 9
SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-07-23'); -- 6
SELECT TIMESTAMPDIFF(YEAR, '2010-01-01', '2025-07-23'); -- 15
SELECT TIMESTAMPDIFF(HOUR, '2025-07-23 10:00:00', '2025-07-23 15:00:00'); -- 5
SELECT TIMEDIFF('14:00:00', '09:30:00'); -- 04:30:00
SELECT TIMEDIFF('2025-07-23 14:00:00', '2025-07-23 09:30:00'); -- 04:30:00
SELECT DATE(NOW()); -- Truncate to date
SELECT TIME(NOW()); -- Truncate to time
SELECT LAST_DAY('2025-07-23'); -- Last day of the month (2025-07-31)
SELECT MAKEDATE(2025, 204); -- 204th day of 2025 (2025-07-23)
SELECT MAKETIME(14, 30, 0); -- 14:30:00
SELECT * FROM events WHERE event_date = CURDATE();
SELECT * FROM events WHERE event_date BETWEEN '2025-07-01' AND '2025-07-31';
SELECT * FROM events WHERE event_time > '12:00:00';
SELECT CAST('2025-07-23' AS DATETIME); -- 2025-07-23 00:00:00
SELECT CAST('14:30:00' AS TIME); -- 14:30:00
SELECT UNIX_TIMESTAMP('2025-07-23 14:30:00'); -- 1753271400 (seconds since epoch)
SELECT FROM_UNIXTIME(1753271400); -- 2025-07-23 14:30:00
SELECT EXTRACT(YEAR FROM NOW()); -- 2025
SELECT EXTRACT(MONTH FROM NOW()); -- 7
SELECT EXTRACT(DAY FROM NOW()); -- 23
SELECT EXTRACT(HOUR_MINUTE FROM NOW()); -- 1435
-- Show current time zone
SELECT @@global.time_zone, @@session.time_zone;
-- Set session time zone
SET time_zone = '+00:00'; -- UTC
SET time_zone = 'America/New_York';
-- Convert between time zones
SELECT CONVERT_TZ('2025-07-23 14:00:00', 'UTC', 'America/New_York');
SELECT ADDDATE('2025-07-23', INTERVAL 5 DAY); -- 2025-07-28
SELECT SUBDATE('2025-07-23', INTERVAL 3 DAY); -- 2025-07-20
SELECT DAYNAME('2025-07-23'); -- Wednesday
SELECT MONTHNAME('2025-07-23'); -- July
SELECT WEEKDAY('2025-07-23'); -- 2 (0=Monday)
SELECT PERIOD_DIFF(202507, 202401); -- 6 (months between periods)
-- Automatically set and update timestamp on row changes
CREATE TABLE example (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
- MySQL date and time types:
DATE
,TIME
,DATETIME
,TIMESTAMP
,YEAR
- Always use single quotes for date/time literals.
- Functions like
NOW()
andCURDATE()
are evaluated per statement, not per row.