🎯 MySQL 选择数据库
数据库选择概述
在 MySQL 中,选择数据库是进行数据操作的前提步骤。通过 USE 语句可以指定当前会话要操作的数据库,之后的所有 SQL 操作都将在该数据库中执行。
USE 语句语法
基本语法
-- 选择数据库的基本语法
USE database_name;
-- 示例
USE my_database;
USE company_db;
USE test_schema;
查看当前数据库
-- 查看当前选择的数据库
SELECT DATABASE();
-- 或者使用
SELECT SCHEMA();
-- 查看当前连接信息
SELECT USER(), DATABASE(), VERSION();
数据库选择示例
基本选择操作
-- 1. 查看所有可用数据库
SHOW DATABASES;
-- 2. 选择特定数据库
USE company_database;
-- 3. 确认当前数据库
SELECT DATABASE();
-- 4. 查看数据库中的表
SHOW TABLES;
-- 5. 查看表结构
DESCRIBE table_name;
连接时指定数据库
# 命令行连接时直接指定数据库
mysql -u username -p database_name
# 示例
mysql -u root -p company_db
mysql -u admin -p -h localhost test_database
# 连接远程数据库并指定数据库
mysql -u username -p -h remote_host -P 3306 database_name
数据库信息查询
查看数据库列表
-- 显示所有数据库
SHOW DATABASES;
-- 显示匹配模式的数据库
SHOW DATABASES LIKE 'test%';
SHOW DATABASES LIKE '%_db';
-- 使用 WHERE 子句过滤
SHOW DATABASES WHERE `Database` NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
查看数据库详细信息
-- 查看数据库创建语句
SHOW CREATE DATABASE database_name;
-- 查看数据库字符集和排序规则
SELECT
SCHEMA_NAME as 'Database',
DEFAULT_CHARACTER_SET_NAME as 'Charset',
DEFAULT_COLLATION_NAME as 'Collation'
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';
-- 查看数据库大小
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'database_name'
GROUP BY table_schema;
表操作示例
选择数据库后的表操作
-- 选择数据库
USE company_db;
-- 查看所有表
SHOW TABLES;
-- 查看表状态
SHOW TABLE STATUS;
-- 查看特定表的结构
DESCRIBE employees;
SHOW COLUMNS FROM employees;
-- 查看表的创建语句
SHOW CREATE TABLE employees;
-- 查询表数据
SELECT * FROM employees LIMIT 10;
跨数据库操作
-- 不切换数据库,直接指定数据库名
SELECT * FROM database1.table1;
SELECT * FROM database2.table2;
-- 跨数据库连接查询
SELECT
a.name,
b.department
FROM database1.employees a
JOIN database2.departments b ON a.dept_id = b.id;
-- 跨数据库数据复制
INSERT INTO database2.backup_table
SELECT * FROM database1.original_table;
权限和访问控制
数据库访问权限
-- 查看当前用户对数据库的权限
SHOW GRANTS;
-- 查看特定用户的权限
SHOW GRANTS FOR 'username'@'localhost';
-- 授予数据库访问权限
GRANT SELECT ON database_name.* TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
-- 撤销权限
REVOKE SELECT ON database_name.* FROM 'username'@'localhost';
🔐 权限级别说明
- 全局权限:对所有数据库的权限
- 数据库权限:对特定数据库的权限
- 表权限:对特定表的权限
- 列权限:对特定列的权限
常见错误和解决方案
错误 1:数据库不存在
-- 错误信息
ERROR 1049 (42000): Unknown database 'database_name'
-- 解决方案:检查数据库是否存在
SHOW DATABASES;
SHOW DATABASES LIKE 'database_name';
-- 如果不存在,创建数据库
CREATE DATABASE database_name;
错误 2:权限不足
-- 错误信息
ERROR 1044 (42000): Access denied for user 'username'@'localhost' to database 'database_name'
-- 解决方案:检查并授予权限
SHOW GRANTS FOR 'username'@'localhost';
-- 由管理员授予权限
GRANT USAGE ON database_name.* TO 'username'@'localhost';
错误 3:没有选择数据库
-- 错误信息
ERROR 1046 (3D000): No database selected
-- 解决方案:选择数据库
USE database_name;
-- 或者在查询中指定数据库
SELECT * FROM database_name.table_name;
编程语言中的数据库选择
PHP 示例
exec('USE company_db');
// 查询当前数据库
$stmt = $pdo->query('SELECT DATABASE()');
$current_db = $stmt->fetchColumn();
echo "Current database: " . $current_db;
?>
Python 示例
import mysql.connector
# 连接时指定数据库
conn = mysql.connector.connect(
host='localhost',
user='username',
password='password',
database='company_db'
)
# 或者连接后切换数据库
conn = mysql.connector.connect(
host='localhost',
user='username',
password='password'
)
cursor = conn.cursor()
cursor.execute('USE company_db')
# 查询当前数据库
cursor.execute('SELECT DATABASE()')
current_db = cursor.fetchone()[0]
print(f"Current database: {current_db}")
最佳实践
📋 数据库选择最佳实践
- 明确指定:总是明确指定要操作的数据库
- 权限最小化:只授予必要的数据库访问权限
- 连接时指定:在连接时就指定数据库,避免后续切换
- 错误处理:处理数据库不存在或权限不足的情况
- 会话管理:在长连接中定期确认当前数据库
- 跨库操作:谨慎进行跨数据库操作,注意性能影响
- 命名规范:使用清晰的数据库命名规范
实用技巧
快速切换数据库
-- 在 MySQL 命令行中快速切换
\u database_name
-- 等同于
USE database_name;
-- 查看当前状态
\s
-- 或者
STATUS;
批量操作多个数据库
-- 创建存储过程来操作多个数据库
DELIMITER //
CREATE PROCEDURE ProcessMultipleDatabases()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE db_name VARCHAR(255);
DECLARE cur CURSOR FOR
SELECT schema_name FROM information_schema.schemata
WHERE schema_name LIKE 'project_%';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO db_name;
IF done THEN
LEAVE read_loop;
END IF;
-- 切换到数据库并执行操作
SET @sql = CONCAT('USE ', db_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 在这里添加具体的操作
-- 例如:SELECT COUNT(*) FROM some_table;
END LOOP;
CLOSE cur;
END//
DELIMITER ;