菜鸟科技网

命令行如何执行sql语句?

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

命令行如何执行sql语句?-图1
(图片来源网络,侵删)

准备工作

在开始之前,需确保已安装目标数据库的命令行客户端,并具备连接数据库的权限,以MySQL为例,需安装mysql客户端;PostgreSQL则需安装psql,需明确数据库的连接信息,包括主机名(或IP地址)、端口号、用户名、密码及数据库名称,若数据库运行在本地且使用默认配置,通常只需提供用户名和数据库名即可。

连接数据库

MySQL连接

使用mysql命令连接数据库的基本语法为:

mysql -h 主机名 -P 端口号 -u 用户名 -p 数据库名

连接本地MySQL的testdb数据库:

mysql -h localhost -P 3306 -u root -p testdb

执行后会提示输入密码,验证通过后即可进入命令行交互模式。

命令行如何执行sql语句?-图2
(图片来源网络,侵删)

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语句并以分号()例如:

命令行如何执行sql语句?-图3
(图片来源网络,侵删)
-- 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

常见问题与解决方案

  1. 连接超时:检查网络防火墙或增加--connect-timeout参数(MySQL)。
  2. 字符集问题:通过--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;"
分享:
扫描分享到社交APP
上一篇
下一篇