🎯 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}")

最佳实践

📋 数据库选择最佳实践

  1. 明确指定:总是明确指定要操作的数据库
  2. 权限最小化:只授予必要的数据库访问权限
  3. 连接时指定:在连接时就指定数据库,避免后续切换
  4. 错误处理:处理数据库不存在或权限不足的情况
  5. 会话管理:在长连接中定期确认当前数据库
  6. 跨库操作:谨慎进行跨数据库操作,注意性能影响
  7. 命名规范:使用清晰的数据库命名规范

实用技巧

快速切换数据库

-- 在 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 ;