在命令行环境中执行SQL语句是数据库管理和开发中常见的操作,尤其适用于自动化脚本、快速测试或远程服务器管理场景,不同数据库系统(如MySQL、PostgreSQL、SQLite等)提供了各自的命令行工具,操作流程虽有差异,但核心逻辑相似,本文将以MySQL和PostgreSQL为例,详细说明命令行执行SQL语句的方法、技巧及注意事项,并辅以实例说明。

准备工作
在开始之前,需确保已安装目标数据库的命令行客户端,并具备连接数据库的权限,以MySQL为例,需安装mysql客户端;PostgreSQL则需安装psql,需明确数据库的连接信息,包括主机名(或IP地址)、端口号、用户名、密码及数据库名称,若数据库运行在本地且使用默认配置,通常只需提供用户名和数据库名即可。
连接数据库
MySQL连接
使用mysql命令连接数据库的基本语法为:
mysql -h 主机名 -P 端口号 -u 用户名 -p 数据库名
连接本地MySQL的testdb数据库:
mysql -h localhost -P 3306 -u root -p testdb
执行后会提示输入密码,验证通过后即可进入命令行交互模式。

PostgreSQL连接
使用psql连接数据库的语法为:
psql -h 主机名 -p 端口号 -U 用户名 -d 数据库名
连接本地PostgreSQL的testdb:
psql -h localhost -p 5432 -U postgres -d testdb
非交互式连接
若需要在脚本中执行SQL,可通过-e(MySQL)或-c(PostgreSQL)参数直接传递SQL语句,避免进入交互模式。
# MySQL mysql -u root -p testdb -e "SELECT * FROM users;" # PostgreSQL psql -U postgres -d testdb -c "SELECT * FROM users;"
执行SQL语句
交互模式执行
连接成功后,命令行会显示提示符(如mysql>或testdb=#),可直接输入SQL语句并以分号()例如:

-- MySQL
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 8.0.26 |
+-----------+
1 row in set (0.00 sec)
-- PostgreSQL
testdb=# SELECT version;
version
-------------------------------------------------------------------------------- PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.0, 64-bit
(1 row)
多行语句与脚本文件
对于复杂SQL(如包含存储过程或事务),可使用source(MySQL)或\i(PostgreSQL)命令执行外部SQL脚本文件。
-- MySQL mysql> source /path/to/script.sql; -- PostgreSQL testdb=# \i /path/to/script.sql;
输出重定向
将查询结果保存到文件,可通过重定向操作符实现:
# MySQL mysql -u root -p testdb -e "SELECT * FROM users;" > result.txt # PostgreSQL psql -U postgres -d testdb -c "SELECT * FROM users;" > result.txt
高级技巧
格式化输出
- MySQL:使用
\G将结果按列垂直显示,适合宽表:mysql> SELECT * FROM users\G
- PostgreSQL:通过
\a取消对齐输出,\t显示元数据:testdb=# \a testdb=# \t testdb=# SELECT * FROM users;
变量与参数传递
部分工具支持变量替换,MySQL可通过--execute参数结合变量:
mysql -u root -p testdb -e "SELECT * FROM users WHERE id=${ID};"
批处理与错误处理
在脚本中执行多条SQL时,需确保语句间以分号分隔,并检查错误码,Bash脚本中:
#!/bin/bash
sql="CREATE TABLE test (id INT); INSERT INTO test VALUES (1);"
mysql -u root -p testdb -e "$sql"
if [ $? -ne 0 ]; then
echo "SQL执行失败" >&2
exit 1
fi
常见问题与解决方案
- 连接超时:检查网络防火墙或增加
--connect-timeout参数(MySQL)。 - 字符集问题:通过
--default-character-set=utf8(MySQL)或--encoding=UTF8(PostgreSQL)指定编码。
相关问答FAQs
Q1: 如何在命令行中执行包含特殊字符的SQL语句?
A: 对于包含引号、分号等特殊字符的SQL,建议使用Here Document或转义处理,MySQL中:
mysql -u root -p testdb <<EOF
INSERT INTO users (name) VALUES ("O'Reilly");
EOF
或使用双引号包裹并转义内部引号:
mysql -u root -p testdb -e "INSERT INTO users (name) VALUES (\"O'Reilly\");"
Q2: 如何在非交互模式下执行SQL并忽略错误继续执行?
A: 可结合--force参数(MySQL)或--set ON_ERROR_STOP=off(PostgreSQL)实现。
# MySQL:忽略错误继续执行 mysql -u root -p testdb --force -e "INVALID SQL; SELECT 1;" # PostgreSQL:关闭自动停止 psql -U postgres -d testdb --set ON_ERROR_STOP=off -c "INVALID SQL; SELECT 1;"
