通过命令行连接到本地MySQL服务器的基础语法为:
mysql -u [用户名] -p
示例:
mysql -u root -p
输入后系统会提示输入密码
注意:密码输入时不会显示字符,直接输入后回车即可
若需连接远程服务器,需指定主机地址:
mysql -h [IP地址] -u [用户名] -p
示例:
mysql -h 192.168.1.100 -u admin -p
执行以下任一命令退出:
EXIT;
-- 或
QUIT;
CREATE DATABASE [数据库名];
示例:
CREATE DATABASE school_db CHARACTER SET utf8mb4;
指定字符集可避免中文乱码问题(推荐使用utf8mb4)
SHOW DATABASES;
输出示例:
+--------------------+
| Database |
+--------------------+
| information_schema |
| school_db |
| mysql |
+--------------------+
USE [数据库名];
示例:
USE school_db;
DROP DATABASE [数据库名];
警告:此操作不可逆,需谨慎使用
基础语法:
CREATE TABLE [表名] (
列名1 数据类型 [约束条件],
列名2 数据类型 [约束条件],
...
);
示例(学生表):
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('M','F') DEFAULT 'M',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
说明:
AUTO_INCREMENT
实现自增主键NOT NULL
强制非空约束ENGINE
指定存储引擎(推荐InnoDB) DESC [表名];
-- 或
SHOW CREATE TABLE [表名];
输出示例:
+------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| age | tinyint(3) | YES | | NULL | |
+------------+------------------+------+-----+-------------------+----------------+
ALTER TABLE [表名] ADD COLUMN [列名] [数据类型] [约束];
示例:
ALTER TABLE students ADD COLUMN email VARCHAR(100) UNIQUE AFTER name;
ALTER TABLE [表名] MODIFY COLUMN [列名] [新数据类型];
示例:
ALTER TABLE students MODIFY COLUMN age SMALLINT UNSIGNED;
ALTER TABLE [表名] DROP COLUMN [列名];
INSERT INTO [表名] (列1,列2,...) VALUES (值1,值2,...);
批量插入示例:
INSERT INTO students (name, age, email)
VALUES
('张三', 18, '[email protected]'),
('李四', 19, '[email protected]');
基础查询:
SELECT * FROM [表名] WHERE [条件];
进阶示例:
SELECT name, age
FROM students
WHERE age BETWEEN 18 AND 20
ORDER BY created_at DESC
LIMIT 10;
UPDATE [表名] SET 列1=值1,列2=值2 WHERE [条件];
示例:
UPDATE students SET age=20 WHERE name='张三';
DELETE FROM [表名] WHERE [条件];
重要:务必添加WHERE条件,否则将清空整表
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
示例:
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT [权限类型] ON [数据库.表] TO '用户'@'主机';
示例:
GRANT SELECT, INSERT ON school_db.* TO 'dev_user'@'%';
SHOW GRANTS FOR '用户'@'主机';
REVOKE [权限类型] ON [数据库.表] FROM '用户'@'主机';
使用mysqldump工具:
mysqldump -u root -p school_db > school_db_backup.sql
mysql -u root -p school_db < school_db_backup.sql
ERROR 2003 (HY000): Can't connect to MySQL server
- 检查服务状态:
systemctl status mysql
(Linux)或net start mysql
(Windows)- 确认防火墙是否开放3306端口
- 验证用户名/密码是否正确
ERROR 1142 (42000): SELECT command denied
GRANT SELECT ON school_db.* TO 'dev_user'@'%';
FLUSH PRIVILEGES;
ERROR 1064 (42000): You have an error in your SQL syntax
- 检查引号、分号等符号是否闭合
- 使用
SHOW WARNINGS;
查看详细错误信息- 参考官方文档验证语法
历史命令复用:
使用上下箭头键快速调用历史命令,或通过mysql --auto-rehash
启用自动补全。
批处理模式:
执行SQL脚本文件:
mysql -u root -p school_db < batch_operations.sql
输出格式化:
使用\G
替代分号竖排显示结果:
SELECT * FROM students LIMIT 1\G
MySQL通过事务机制实现ACID特性,基础命令包括:
START TRANSACTION; -- 开启事务
COMMIT; -- 提交事务
ROLLBACK; -- 提交回滚
示例场景:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE user_id = 1001;
UPDATE accounts SET balance = balance + 500 WHERE user_id = 1002;
COMMIT;
注意:InnoDB引擎支持事务,MyISAM引擎不支持
查看与修改隔离级别:
SELECT @@transaction_isolation; -- 查看当前隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置会话级隔离级别
四种隔离级别:
CREATE INDEX idx_name ON users(name); -- 单列索引
CREATE INDEX idx_name_age ON users(name, age); -- 复合索引
DROP INDEX idx_name ON users;
最佳实践:
EXPLAIN
分析查询是否命中索引SHOW INDEX FROM users;
输出示例:
+-------+------------+-------------+--------------+-------------+-----------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |
+-------+------------+-------------+--------------+-------------+-----------+-------------+
| users | 0 | PRIMARY | 1 | id | A | 1000 |
| users | 1 | idx_name | 1 | name | A | 500 |
+-------+------------+-------------+--------------+-------------+-----------+-------------+
LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
注意:需确保文件权限和secure_file_priv
配置正确
mysql -u root -p -e "SELECT * FROM users" school_db > export.csv
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -- 查看缓冲池大小
SET GLOBAL innodb_buffer_pool_size = 2147483648; -- 动态调整参数
SHOW STATUS LIKE 'Threads_connected'; -- 查看当前连接数
SHOW PROCESSLIST; -- 显示活跃连接详情
DELIMITER //
CREATE PROCEDURE GetStudent(IN student_id INT)
BEGIN
SELECT * FROM students WHERE id = student_id;
END //
DELIMITER ;
调用方式:
CALL GetStudent(1001);
CREATE FUNCTION AgeGroup(age INT)
RETURNS VARCHAR(10)
BEGIN
RETURN CASE
WHEN age < 18 THEN '未成年'
ELSE '成年'
END;
END
使用示例:
SELECT name, AgeGroup(age) FROM students;
(SELECT name FROM teachers)
UNION
(SELECT name FROM students)
ORDER BY name;
SELECT
department,
COUNT(*) AS total,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 10000;
使用EXPLAIN
诊断SQL:
EXPLAIN SELECT * FROM users WHERE age > 25;
输出字段解析:
- type:访问类型(ALL全表扫描、index索引扫描、range范围扫描)
- key:实际使用的索引
- rows:预估扫描行数
修改my.cnf
:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
分析工具:
mysqldumpslow -s t /var/log/mysql/slow.log
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1');
ALTER USER 'dev_user'@'%' IDENTIFIED BY 'NewSecurePass456!';
GRANT USAGE ON *.* TO 'user'@'%' REQUIRE SSL;