目录 1. 连接MySQL数据库 2. 数据库操作 2.1 查看数据库 2.2 创建数据库 2.3 删除数据库 3. 表操作 3.1 查看表信息 3.2 创建表 3.3 常用数据类型 3.4 修改表结构 3.5 删除表 4. 数据操作 (CRUD) 4.1 插入数据 (CREATE) 4.2 查询数据 (READ) 4.3 更新数据 (UPDATE) 4.4 删除数据 (DELETE) 5. 高级查询 5.1 连接查询 (JOIN) 内连接 (INNER JOIN) 左连接 (LEFT JOIN) 右连接 (RIGHT JOIN) 全外连接 (FULL OUTER JOIN) 5.2 子查询 5.3 窗口函数 (MySQL 8.0+) 5.4 公用表表达式 (CTE) - MySQL 8.0+ 6. 索引操作 7. 用户和权限管理 7.1 用户管理基础 7.2 创建用户 基本语法 创建用户时设置密码的加密处理 创建用户案例 创建用户时常见报错的解决方法 7.3 删除用户 7.4 修改用户密码 基本语法 使用PASSWORD()函数的注意事项 修改用户密码示例 7.5 权限管理 7.6 常用权限类型 8. 常用函数 8.1 字符串函数 8.2 数值函数 8.3 日期时间函数 8.4 条件函数 8.5 聚合函数 9. 事务处理 9.1 事务基础 9.2 事务示例 9.3 保存点 (Savepoint) 9.4 事务隔离级别 10. 备份和恢复 10.1 使用 mysqldump 备份 10.2 恢复数据库 10.3 二进制日志备份
1. 连接MySQL数据库
基本连接语法
mysql -u root -p
mysql -h hostname -u root -p demo
mysql -h hostname -P 3306 -u root -p demo
连接参数说明
-u
: 用户名-p
: 密码(会提示输入)-h
: 主机名或IP地址-P
: 端口号(默认3306)
2. 数据库操作
2.1 查看数据库
SHOW DATABASES ; mysql> show databases ;
+
| Database |
+
| information_schema |
| mysql |
| performance_schema |
| sys |
+
4 rows in set ( 0.01 sec)
USE mysql; mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with - ADatabase changed
SELECT DATABASE ( ) ; mysql> SELECT DATABASE ( ) ;
+
| DATABASE ( ) |
+
| mysql |
+
1 row in set ( 0.00 sec)
2.2 创建数据库
CREATE DATABASE shop;
CREATE DATABASE IF NOT EXISTS shop
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci; mysql> CREATE DATABASE IF NOT EXISTS shop - > CHARACTER SET utf8mb4 - > COLLATE utf8mb4_general_ci;
Query OK, 1 row affected ( 0.00 sec) mysql> show databases ;
+
| Database |
+
| information_schema |
| mysql |
| performance_schema |
| shop |
| sys |
+
5 rows in set ( 0.00 sec)
2.3 删除数据库
DROP DATABASE shop;
DROP DATABASE IF EXISTS shop;
3. 表操作
3.1 查看表信息
SHOW TABLES ;
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;
SHOW CREATE TABLE table_name;
SHOW TABLE STATUS LIKE 'table_name' ;
3.2 创建表
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY , username VARCHAR ( 50 ) NOT NULL UNIQUE , email VARCHAR ( 100 ) NOT NULL , password VARCHAR ( 255 ) NOT NULL , age INT DEFAULT 0 , is_active BOOLEAN DEFAULT TRUE , created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ; mysql> use shop;
Database changed
mysql> show tables ;
Empty set ( 0.00 sec) mysql> CREATE TABLE users ( - > id INT AUTO_INCREMENT PRIMARY KEY , - > username VARCHAR ( 50 ) NOT NULL UNIQUE , - > email VARCHAR ( 100 ) NOT NULL , - > password VARCHAR ( 255 ) NOT NULL , - > age INT DEFAULT 0 , - > is_active BOOLEAN DEFAULT TRUE , - > created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , - > updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - > ) ;
Query OK, 0 rows affected ( 0.02 sec) mysql> show tables ;
+
| Tables_in_shop |
+
| users |
+
1 row in set ( 0.00 sec)
3.3 常用数据类型
类型 说明 示例 INT 整数 age INT
VARCHAR(n) 可变长度字符串 name VARCHAR(50)
TEXT 长文本 description TEXT
DECIMAL(m,d) 精确小数 price DECIMAL(10,2)
DATE 日期 birth_date DATE
DATETIME 日期时间 created_at DATETIME
TIMESTAMP 时间戳 updated_at TIMESTAMP
BOOLEAN 布尔值 is_active BOOLEAN
3.4 修改表结构
ALTER TABLE table_name ADD COLUMN column_name data_type;
ALTER TABLE users ADD COLUMN phone VARCHAR ( 20 ) ;
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE table_name MODIFY COLUMN column_name new_data_type;
ALTER TABLE users MODIFY COLUMN age SMALLINT ;
ALTER TABLE table_name CHANGE old_name new_name data_type;
ALTER TABLE users CHANGE username user_name VARCHAR ( 50 ) ;
RENAME TABLE old_table_name TO new_table_name;
ALTER TABLE table_name ADD PRIMARY KEY ( column_name) ;
ALTER TABLE table_name ADD FOREIGN KEY ( column_name)
REFERENCES other_table( column_name) ; mysql> DESC users;
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int | NO | PRI | NULL | auto_increment |
| user_name | varchar ( 50 ) | YES | UNI | NULL | |
| email | varchar ( 100 ) | NO | | NULL | |
| password | varchar ( 255 ) | NO | | NULL | |
| age | smallint | YES | | NULL | |
| is_active | tinyint ( 1 ) | YES | | 1 | |
| created_at | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+
8 rows in set ( 0.00 sec)
3.5 删除表
DROP TABLE table_name;
DROP TABLE IF EXISTS table_name;
DROP TABLE table1, table2, table3;
4. 数据操作 (CRUD)
4.1 插入数据 (CREATE)
INSERT INTO users ( user_name, email, password)
VALUES ( 'john_doe' , 'john@example.com' , 'hashed_password' ) ; mysql> INSERT INTO users ( user_name, email, password) - > VALUES ( 'john_doe' , 'john@example.com' , 'hashed_password' ) ;
Query OK, 1 row affected ( 0.00 sec)
INSERT INTO users ( user_name, email, password) VALUES
( 'user1' , 'user1@example.com' , 'password1' ) ,
( 'user2' , 'user2@example.com' , 'password2' ) ,
( 'user3' , 'user3@example.com' , 'password3' ) ;
INSERT IGNORE INTO users ( user_name, email)
VALUES ( 'existing_user' , 'existing@example.com' ) ;
INSERT INTO users ( id, user_name, email, password)
VALUES ( 1 , 'john' , 'john@example.com' , 'hashed_password' )
ON DUPLICATE KEY UPDATE email = VALUES ( email) ; mysql> INSERT INTO users ( id, user_name, email, password) - > VALUES ( 1 , 'john' , 'john@example.com' , 'hashed_password' ) - > ON DUPLICATE KEY UPDATE email = VALUES ( email) ;
Query OK, 0 rows affected, 1 warning ( 0.00 sec)
4.2 查询数据 (READ)
基本查询
SELECT * FROM users; mysql> SELECT * FROM users;
+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025 - 09 - 04 16 :20 :58 | 2025 - 09 - 04 16 :20 :58 |
| 2 | user1 | user1@example.com | password1 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 3 | user2 | user2@example.com | password2 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 4 | user3 | user3@example.com | password3 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 5 | existing_user | existing@example.com | | NULL | 1 | 2025 - 09 - 04 16 :23 :08 | 2025 - 09 - 04 16 :23 :08 |
+
5 rows in set ( 0.00 sec)
SELECT user_name, email FROM users; mysql> SELECT user_name, email FROM users;
+
| user_name | email |
+
| john_doe | john@example.com |
| user1 | user1@example.com |
| user2 | user2@example.com |
| user3 | user3@example.com |
| existing_user | existing@example.com |
+
5 rows in set ( 0.00 sec)
SELECT DISTINCT email FROM users; mysql> SELECT DISTINCT email FROM users;
+
| email |
+
| john@example.com |
| user1@example.com |
| user2@example.com |
| user3@example.com |
| existing@example.com |
+
5 rows in set ( 0.00 sec)
条件查询
SELECT * FROM users WHERE id = 1 ;
SELECT * FROM users WHERE user_name = 'john_doe' ; mysql> SELECT * FROM users WHERE id = 1 ;
+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025 - 09 - 04 16 :20 :58 | 2025 - 09 - 04 16 :20 :58 |
+
1 row in set ( 0.00 sec) mysql> SELECT * FROM users WHERE user_name = 'john_doe' ;
+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025 - 09 - 04 16 :20 :58 | 2025 - 09 - 04 16 :20 :58 |
+
1 row in set ( 0.00 sec)
SELECT * FROM users WHERE age = NULL ;
SELECT * FROM users WHERE user_name LIKE 'john%' ;
SELECT * FROM users WHERE email LIKE '%@gmail.com' ; mysql> SELECT * FROM users WHERE user_name LIKE 'john%' ;
+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025 - 09 - 04 16 :20 :58 | 2025 - 09 - 04 16 :20 :58 |
+
1 row in set ( 0.00 sec) mysql> SELECT * FROM users WHERE email LIKE '%@example.com' ;
+
| id | user_name | email | password | age | is_active | created_at | updated_at |
+
| 1 | john_doe | john@example.com | hashed_password | NULL | 1 | 2025 - 09 - 04 16 :20 :58 | 2025 - 09 - 04 16 :20 :58 |
| 2 | user1 | user1@example.com | password1 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 3 | user2 | user2@example.com | password2 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 4 | user3 | user3@example.com | password3 | NULL | 1 | 2025 - 09 - 04 16 :22 :58 | 2025 - 09 - 04 16 :22 :58 |
| 5 | existing_user | existing@example.com | | NULL | 1 | 2025 - 09 - 04 16 :23 :08 | 2025 - 09 - 04 16 :23 :08 |
+
5 rows in set ( 0.00 sec)
SELECT * FROM users WHERE age > 18 AND is_active = TRUE ;
SELECT * FROM users WHERE user_name = 'john' OR email = 'john@example.com' ;
SELECT * FROM users WHERE phone IS NULL ;
SELECT * FROM users WHERE phone IS NOT NULL ;
SELECT * FROM users WHERE id IN ( 1 , 2 , 3 , 4 , 5 ) ;
SELECT * FROM users WHERE user_name NOT IN ( 'admin' , 'root' ) ;
排序和分页
SELECT * FROM users ORDER BY created_at DESC ;
SELECT * FROM users ORDER BY age ASC , username DESC ;
SELECT * FROM users LIMIT 10 ;
SELECT * FROM users LIMIT 10 OFFSET 20 ;
SELECT * FROM users LIMIT 20 , 10 ;
聚合查询
SELECT COUNT ( * ) FROM users;
SELECT COUNT ( phone) FROM users;
SELECT MAX ( age) , MIN ( age) , AVG ( age) FROM users;
SELECT SUM ( age) FROM users;
SELECT age, COUNT ( * ) as count FROM users GROUP BY age;
SELECT DATE ( created_at) as date , COUNT ( * ) as daily_users
FROM users
GROUP BY DATE ( created_at)
ORDER BY date DESC ;
SELECT age, COUNT ( * ) as count
FROM users
GROUP BY age
HAVING count > 5 ;
4.3 更新数据 (UPDATE)
UPDATE users SET email = 'newemail@example.com' WHERE id = 1 ;
UPDATE users SET email = 'updated@example.com' , age = 25 , updated_at = CURRENT_TIMESTAMP
WHERE username = 'john_doe' ;
UPDATE users SET is_active = FALSE WHERE created_at < '2022-01-01' ;
UPDATE users SET age = age + 1 WHERE birthday = CURDATE( ) ;
4.4 删除数据 (DELETE)
DELETE FROM users WHERE id = 1 ;
DELETE FROM users WHERE is_active = FALSE ;
DELETE FROM users;
TRUNCATE TABLE users;
5. 高级查询
5.1 连接查询 (JOIN)
内连接 (INNER JOIN)
SELECT u. username, p. title
FROM users u
INNER JOIN posts p ON u. id = p. user_id;
SELECT u. username, p. title, c. content
FROM users u
INNER JOIN posts p ON u. id = p. user_id
INNER JOIN comments c ON p. id = c. post_id;
左连接 (LEFT JOIN)
SELECT u. username, p. title
FROM users u
LEFT JOIN posts p ON u. id = p. user_id;
右连接 (RIGHT JOIN)
SELECT u. username, p. title
FROM users u
RIGHT JOIN posts p ON u. id = p. user_id;
全外连接 (FULL OUTER JOIN)
SELECT u. username, p. title
FROM users u LEFT JOIN posts p ON u. id = p. user_id
UNION
SELECT u. username, p. title
FROM users u RIGHT JOIN posts p ON u. id = p. user_id;
5.2 子查询
SELECT * FROM users
WHERE id = ( SELECT user_id FROM posts WHERE title = 'My First Post' ) ;
SELECT * FROM users
WHERE id IN ( SELECT user_id FROM posts WHERE created_at > '2023-01-01' ) ;
SELECT * FROM users u
WHERE EXISTS ( SELECT 1 FROM posts p WHERE p. user_id = u. id) ;
SELECT avg_age. age_group, COUNT ( * ) as user_count
FROM ( SELECT CASE WHEN age < 18 THEN 'Youth' WHEN age BETWEEN 18 AND 65 THEN 'Adult' ELSE 'Senior' END as age_groupFROM users
) avg_age
GROUP BY avg_age. age_group;
5.3 窗口函数 (MySQL 8.0+)
SELECT username, age, ROW_NUMBER( ) OVER ( ORDER BY age DESC ) as rank
FROM users;
SELECT username, age, RANK( ) OVER ( ORDER BY age DESC ) as rank, DENSE_RANK( ) OVER ( ORDER BY age DESC ) as dense_rank
FROM users;
SELECT username, department, salary, ROW_NUMBER( ) OVER ( PARTITION BY department ORDER BY salary DESC ) as dept_rank
FROM employees;
5.4 公用表表达式 (CTE) - MySQL 8.0+
WITH high_value_users AS ( SELECT * FROM users WHERE age > 30
)
SELECT username, email FROM high_value_users;
WITH RECURSIVE employee_hierarchy AS ( SELECT id, name, manager_id, 1 as level FROM employeesWHERE manager_id IS NULL UNION ALL SELECT e. id, e. name, e. manager_id, eh. level + 1 FROM employees eINNER JOIN employee_hierarchy eh ON e. manager_id = eh. id
)
SELECT * FROM employee_hierarchy;
6. 索引操作
6.1 创建索引
CREATE INDEX idx_username ON users ( username) ;
CREATE UNIQUE INDEX idx_email ON users ( email) ;
CREATE INDEX idx_name_age ON users ( username, age) ;
CREATE INDEX idx_email_prefix ON users ( email( 10 ) ) ;
CREATE TABLE users ( id INT PRIMARY KEY , username VARCHAR ( 50 ) , email VARCHAR ( 100 ) , INDEX idx_username ( username) , UNIQUE INDEX idx_email ( email)
) ;
6.2 查看索引
SHOW INDEX FROM users;
EXPLAIN SELECT * FROM users WHERE username = 'john' ;
6.3 删除索引
DROP INDEX idx_username ON users;
ALTER TABLE users DROP PRIMARY KEY ;
7. 用户和权限管理
7.1 用户管理基础
查看当前用户信息
SELECT USER ( ) ;
SHOW GRANTS;
SHOW GRANTS FOR 'root' @'localhost' ;
用户信息查询
USE mysql;
DESC user ;
SELECT HOST, USER , authentication_string FROM user ;
SELECT Host, User FROM mysql. user ;
SELECT DISTINCT User FROM mysql. user ;
SELECT Host, User , authentication_string, Select_priv, Insert_priv, Update_priv, Delete_priv
FROM mysql. user
WHERE User = 'root' ;
SHOW GRANTS FOR 'root' @'localhost' ;
7.2 创建用户
基本语法
CREATE USER '用户名' @'主机名' IDENTIFIED BY '密码' ;
CREATE USER [ IF NOT EXISTS ] '用户名' @'主机名'
IDENTIFIED BY '密码' [ IDENTIFIED WITH 插件名 BY '密码' ] [ PASSWORD EXPIRE [ DEFAULT | NEVER | INTERVAL N DAY ] ] [ ACCOUNT [ LOCK | UNLOCK ] ] [ DEFAULT ROLE 角色名 [ , 角色名] . . . ] [ REQUIRE { NONE | SSL | X509 | CIPHER 'str' | ISSUER 'str' | SUBJECT 'str' }]
创建用户时设置密码的加密处理
SHOW VARIABLES LIKE 'default_authentication_plugin' ;
CREATE USER 'test_user' @'localhost' IDENTIFIED WITH mysql_native_password BY '123456' ;
创建用户案例
CREATE USER 'local_user' @'localhost' IDENTIFIED BY 'local_123' ;
CREATE USER 'remote_user' @'%' IDENTIFIED BY 'remote_123' ;
CREATE USER 'office_user' @'192.168.1.100' IDENTIFIED BY 'office_123' ;
CREATE USER 'dept_user' @'192.168.1.%' IDENTIFIED BY 'dept_123' ;
CREATE USER 'app_user' @'%' IDENTIFIED BY 'app_123456' PASSWORD EXPIRE NEVER;
SELECT host, user FROM mysql. user WHERE user LIKE '%user%' ;
创建用户时常见报错的解决方法
CREATE USER IF NOT EXISTS 'existing_user' @'localhost' IDENTIFIED BY 'password' ;
SHOW VARIABLES LIKE 'validate_password%' ;
CREATE USER 'strong_user' @'localhost' IDENTIFIED BY 'StrongPass123!' ;
7.3 删除用户
基本语法
DROP USER '用户名' @'主机名' ;
DROP USER '用户1' @'主机1' , '用户2' @'主机2' ;
DROP USER IF EXISTS '用户名' @'主机名' ;
删除用户案例
DROP USER 'test_user' @'localhost' ;
DROP USER 'user1' @'localhost' , 'user2' @'%' ;
DROP USER IF EXISTS 'maybe_not_exist' @'localhost' ;
SELECT CONCAT( 'DROP USER ''' , User , '''@''' , Host, ''';' ) AS drop_command
FROM mysql. user
WHERE User LIKE 'test_%' ;
DROP USER 'test_user1' @'localhost' ;
DROP USER 'test_user2' @'%' ;
SELECT Host, User FROM mysql. user WHERE User LIKE 'test_%' ;
7.4 修改用户密码
基本语法
ALTER USER '用户名' @'主机名' IDENTIFIED BY '新密码' ;
SET PASSWORD FOR '用户名' @'主机名' = '新密码' ;
SET PASSWORD = '新密码' ;
使用PASSWORD()函数的注意事项
SET PASSWORD FOR 'user' @'host' = PASSWORD( '新密码' ) ;
ALTER USER 'user' @'host' IDENTIFIED BY '新密码' ;
修改用户密码示例
ALTER USER 'app_user' @'%' IDENTIFIED BY 'new_strong_password123!' ;
ALTER USER USER ( ) IDENTIFIED BY 'my_new_password123!' ;
ALTER USER 'temp_user' @'localhost'
IDENTIFIED BY 'temp_password123!'
PASSWORD EXPIRE INTERVAL 30 DAY ;
ALTER USER 'new_employee' @'%'
IDENTIFIED BY 'initial_password123!'
PASSWORD EXPIRE;
SELECT CONCAT( 'ALTER USER ''' , User , '''@''' , Host, ''' IDENTIFIED BY ''new_password_' , User , ''';' ) AS alter_command
FROM mysql. user
WHERE User LIKE 'temp_%' ;
7.5 权限管理
GRANT ALL PRIVILEGES ON database_name. * TO 'username' @'localhost' ;
GRANT SELECT , INSERT , UPDATE , DELETE ON database_name. table_name TO 'username' @'localhost' ;
GRANT CREATE , DROP ON database_name. * TO 'username' @'localhost' ;
SHOW GRANTS FOR 'username' @'localhost' ;
SHOW GRANTS FOR CURRENT_USER ( ) ;
REVOKE ALL PRIVILEGES ON database_name. * FROM 'username' @'localhost' ;
REVOKE SELECT ON database_name. table_name FROM 'username' @'localhost' ;
FLUSH PRIVILEGES ;
7.6 常用权限类型
权限 说明 ALL PRIVILEGES 所有权限 SELECT 查询权限 INSERT 插入权限 UPDATE 更新权限 DELETE 删除权限 CREATE 创建数据库/表权限 DROP 删除数据库/表权限 ALTER 修改表结构权限 INDEX 创建/删除索引权限 GRANT OPTION 授权权限
8. 常用函数
8.1 字符串函数
SELECT CONCAT( 'Hello' , ' ' , 'World' ) ;
SELECT CONCAT_WS( '-' , '2023' , '12' , '25' ) ;
SELECT LENGTH( 'Hello World' ) ;
SELECT CHAR_LENGTH( 'Hello World' ) ;
SELECT UPPER( 'hello' ) , LOWER( 'WORLD' ) ;
SELECT SUBSTRING( 'Hello World' , 1 , 5 ) ;
SELECT LEFT ( 'Hello World' , 5 ) ;
SELECT RIGHT ( 'Hello World' , 5 ) ;
SELECT TRIM( ' Hello World ' ) ;
SELECT LTRIM( ' Hello World ' ) ;
SELECT RTRIM( ' Hello World ' ) ;
SELECT REPLACE ( 'Hello World' , 'World' , 'MySQL' ) ;
SELECT LOCATE( 'World' , 'Hello World' ) ;
SELECT REPEAT ( 'Hello' , 3 ) ;
8.2 数值函数
SELECT ABS( - 5 ) , ROUND ( 3.14159 , 2 ) ;
SELECT CEIL( 3.2 ) , FLOOR( 3.8 ) ;
SELECT RAND( ) ;
SELECT RAND( 1 ) ;
SELECT SQRT( 16 ) , POWER( 2 , 3 ) ;
SELECT MOD ( 10 , 3 ) ;
SELECT GREATEST( 1 , 5 , 3 ) , LEAST( 1 , 5 , 3 ) ;
8.3 日期时间函数
SELECT NOW ( ) , CURDATE( ) , CURTIME( ) ;
SELECT CURRENT_TIMESTAMP , CURRENT_DATE , CURRENT_TIME ;
SELECT DATE_FORMAT( NOW ( ) , '%Y-%m-%d %H:%i:%s' ) ;
SELECT DATE_FORMAT( NOW ( ) , '%Y年%m月%d日' ) ;
SELECT YEAR ( NOW ( ) ) , MONTH ( NOW ( ) ) , DAY ( NOW ( ) ) ;
SELECT HOUR ( NOW ( ) ) , MINUTE ( NOW ( ) ) , SECOND ( NOW ( ) ) ;
SELECT DAYOFWEEK( NOW ( ) ) , DAYOFYEAR( NOW ( ) ) ;
SELECT DATE_ADD( NOW ( ) , INTERVAL 1 DAY ) ;
SELECT DATE_ADD( NOW ( ) , INTERVAL 1 MONTH ) ;
SELECT DATE_ADD( NOW ( ) , INTERVAL - 1 YEAR ) ;
SELECT DATE_SUB( NOW ( ) , INTERVAL 1 WEEK) ;
SELECT DATEDIFF( '2023-12-25' , '2023-01-01' ) ;
SELECT TIMESTAMPDIFF( YEAR , '1990-01-01' , NOW ( ) ) ;
SELECT UNIX_TIMESTAMP( NOW ( ) ) ;
SELECT FROM_UNIXTIME( 1640995200 ) ;
8.4 条件函数
SELECT username, IF ( age >= 18 , '成年' , '未成年' ) as status FROM users;
SELECT username, CASE WHEN age < 18 THEN '未成年' WHEN age BETWEEN 18 AND 65 THEN '成年' ELSE '老年' END as age_group
FROM users;
SELECT username, COALESCE ( phone, email, '无联系方式' ) as contact FROM users;
SELECT NULLIF ( age, 0 ) FROM users;
8.5 聚合函数
SELECT COUNT ( * ) , COUNT ( phone) FROM users;
SELECT SUM ( age) , AVG ( age) FROM users;
SELECT MAX ( age) , MIN ( age) FROM users;
SELECT department, COUNT ( * ) , AVG ( salary)
FROM employees
GROUP BY department;
SELECT department, GROUP_CONCAT( name) as employees
FROM employees
GROUP BY department;
9. 事务处理
9.1 事务基础
START TRANSACTION ;
BEGIN ;
COMMIT ;
ROLLBACK ;
9.2 事务示例
START TRANSACTION ;
SELECT balance FROM accounts WHERE account_id = 1 ;
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 1 ;
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 2 ;
COMMIT ;
9.3 保存点 (Savepoint)
START TRANSACTION ; INSERT INTO users ( username, email) VALUES ( 'user1' , 'user1@example.com' ) ;
SAVEPOINT sp1; INSERT INTO users ( username, email) VALUES ( 'user2' , 'user2@example.com' ) ;
ROLLBACK TO SAVEPOINT sp1;
RELEASE SAVEPOINT sp1; COMMIT ;
9.4 事务隔离级别
SELECT @@transaction_isolation ;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED ;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
10. 备份和恢复
10.1 使用 mysqldump 备份
mysqldump -u username -p database_name > backup.sql
mysqldump -u username -p --databases db1 db2 db3 > backup.sql
mysqldump -u username -p --all-databases > all_backup.sql
mysqldump -u username -p --no-data database_name > structure.sql
mysqldump -u username -p --no-create-info database_name > data.sql
mysqldump -u username -p database_name table1 table2 > tables_backup.sql
mysqldump -u username -p database_name | gzip > backup.sql.gz
10.2 恢复数据库
mysql -u username -p database_name < backup.sql
gunzip < backup.sql.gz | mysql -u username -p database_name
mysql -u username -p -e "CREATE DATABASE new_database;"
mysql -u username -p new_database < backup.sql
10.3 二进制日志备份
SHOW MASTER STATUS ;
SHOW BINARY LOGS;
FLUSH LOGS;
mysqlbinlog mysql-bin.000001 | mysql -u username -p database_name