linux系统下怎么在终端运行sql语句
发布网友
发布时间:2022-04-19 14:09
我来回答
共6个回答
懂视网
时间:2022-04-08 03:40
8.3 使用C语言访问MySQL数据
8.3.3 执行SQL语句
执行SQL语句的主要API函数被恰当的命名为:
int mysql_query(MYSQL *connection, const char *query);
这个例程接受连接结构指针和文本字符串形式的有效SQL语句,如果成功,它返回0.
1.不返回数据的SQL语句
为简单起见,先看一些不返回任何数据的SQL语句:UPDATE,DELETE和INSERT.
下面的函数用于检查受查询影响的行数:
my_ulonglong mysql_affected_rows(MYSQL *connection);
这个函数的返回值类型很不常见,它使用无符号类型是出于移植性的考虑.当使用printf时,最好使用%lu格式将其转换为无符号长整形.这个函数返回受之前执行的UPDATE,DELETE和INSERT查询影响的函数.MySQL返回的是被一个更新操作修改的行数.
通常对于mysql_系列函数,返回值0表示没有行受到影响,正数则是实际的结果,一般表示受影响的行数.
编写程序insert1.c,尝试在表中插入一个新行.
mysql_affected_rows返回实际对数据进行的修改或者插入的行数.此外当从数据库中删除数据时,如果使用WHERE子句删除数据,那么mysql_affected_rows将返回删除的行数.但如果在DELETE语句中卖没有WHERE子句,那么表中的所有行都会被删除,但是由程序返回的受影响的行数却为0.这是因为MySQL优化了删除所有行的操作,它并不是执行许多个单行删除操作.
2.发现插入的内容
auto_increment类型由MySQL自动分配ID,这一特性非常有用,特别是当有许多用户的时候.
CREATE TABLE children(
childno int auto_increment NULL PRIMARY KEY,
fname varchar(30),
age int
);
MySQL提供函数LAST_INSERT_ID()给出了auto_increment列的值.
无论何时MySQL向auto_increment列中插入数据,MySQL都会基于每个用户对最后分配的值进行跟踪.用户程序可以通过SELECT专用函数LAST_INSERT_ID()来发现该值,这个函数的作用有点像表中的虚拟列.
编写程序insert2.c
3.返回数据的语句
SQL最常见的用法当然是提取数据而不是插入或更新数据.数据是使用SELECT语句提取的.
MySQL也支持使用SQL语句SHOW,DESCRIBE和EXPLAIN来返回结果,暂时不涉及它们.
在C应用程序中提取数据一般需要下面4个步骤:
执行查询
提取数据
处理数据
必要的清理工作
就像之前的INSERT和DELETE语句一样,将使用mysql_query来发送SQL语句执行查询,然后使用mysql_store_result或mysql_use_result来提取数据,具体使用哪个函数取决于想如何提取数据.接着将使用一系列mysql_fetch_row调用来处理数据,最后使用mysql_free_result释放查询占用的内存资源.
mysql_use_result和mysql_store_result的区别主要在于,是想一次返回一行数据,还是一次返回所有的结果.当语句结果集较小时,后者比较合适.
一次提取所有数据的函数
可以使用mysql_store_result在一次调用中从SELECT中提取所有数据:
MYSQL_RES *mysql_store_result(MYSQL *connection);
显然,需要在成功调用mysql_query之后使用此函数.这个函数将立刻保存从客户端中返回的数据.它返回一个指向结果集结构的指针,如果失败返回NULL.
my_ulonglong mysql_num_rows(MYSQL_RES *result);
这个函数接受由mysql_store_result返回的结果,并返回的结果结构,并返回结果集中的行数.如果mysql_store_result调用成功,mysql_num_rows将始终都是成功的.
如果使用的是一个特别庞大的数据集,那么最好提取小一些,更容易管理的信息块,因为这将更快地将控制权返回给应用程序,并且不会占用大量的网络资源.
使用mysql_fetch_row来处理它,也可以使用mysql_data_seek,mysql_row_seek和mysql_row_tell在数据集中来回移动.
1.mysql_fetch_row:这个函数从使用mysql_store_result得到的结果中提取一行,并把它放到一个行结构中.当数据用完或发生错误时返回NULL.
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
2.mysql_data_seek:这个函数用来在结果集中进行跳转,设置将被下一个mysql_fetch_row操作返回的行.参数offset的值是一个行号,它必须在0到结果集总行数减1的返回内.传递0将会导致下一个mysql_fetch_row调用返回结果集中的第一行.
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
3.mysql_row_tell:这个函数返回一个偏移值,它用来表示结果集中的当前位置.它不是行号,不能将它用于mysql_data_seek.
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
但是可以这样使用它的返回值:
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
这将在结果集中移动当前位置,并返回之前的值.
这对函数对于结果集中的已知点之间的移动非常有用.但是不要混淆由row_tell和row_seek使用的偏移量和data_seek使用的行号.
4.完成了对数据的所有操作之后,必须明确地调用mysql_free_result来让MySQL库完成善后处理.
提取数据
编写程序select1.c提取所有年龄大于5的记录
#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
int main(int argc, char *argv[]){
int res;
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
mysql_init(&my_connection);
//初始化连接句柄,返回一个指向新分配的连接句柄的指针,只是分配和初始化了一个结构
if (mysql_real_connect(&my_connection, "localhost", "rick","secret", "foo", 0, NULL, 0)){
//mysql_real_connect向一个连接提供参数,指针connection指向已经被mysql_init初始化过的结构
printf("Connection success
");
res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");
//mysql_query的参数为结构指针和文本字符串形式的SQL语句,如果成功则执行字符串表示的SQL语句,返回0
if (res){
printf("SELECT error: %s
", mysql_error(&my_connection));
}else{
res_ptr = mysql_store_result(&my_connection);
//mysql_store_result在一次调用中从SELECT中提取所有数据,返回指向结果集结构的指针
if (res_ptr){
printf("Retrieved %lu rows
", (unsigned long)mysql_num_rows(res_ptr));
//mysql_num_rows得到返回记录的数目,接受由mysql_store_result返回的结果结构指针
while((sqlrow = mysql_fetch_row(res_ptr))){
//mysql_fetch_row从mysql_store_result的结果结构中提取一行
printf("Fetched data...
");
}
if (mysql_errno(&my_connection)){
//mysql_errno返回错误码,非零
fprintf(stderr, "Retrieve error: %s
", mysql_error(&my_connection));
//mysql_error返回错误的文本信息
}
mysql_free_result(res_ptr);
//mysql_free_result释放查询占用的内存资源
}
}
mysql_close(&my_connection);
//关闭连接
}
else{
fprintf(stderr, "Connection failed
");
if (mysql_errno(&my_connection)){
fprintf(stderr, "Connection error %d: %s
", mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}
linux程序设计——执行SQL语句(第八章)
标签:
热心网友
时间:2022-04-08 00:48
主要有以下几种方法:
1、将SQL语句直接嵌入到shell脚本文件中
代码如下:
--演示环境
[root@SZDB ~]# more /etc/issue
CentOS release 5.9 (Final)
Kernel \r on an \m
root@localhost[(none)]> show variables like 'version';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| version | 5.6.12-log |
+---------------+------------+
[root@SZDB ~]# more shell_call_sql1.sh
#!/bin/bash
# Define log
TIMESTAMP=`date +%Y%m%d%H%M%S`
LOG=call_sql_${TIMESTAMP}.log
echo "Start execute sql statement at `date`." >>${LOG}
# execute sql stat
mysql -uroot -p123456 -e "
tee /tmp/temp.log
drop database if exists tempdb;
create database tempdb;
use tempdb
create table if not exists tb_tmp(id smallint,val varchar(20));
insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark');
select * from tb_tmp;
notee
quit"
echo -e "\n">>${LOG}
echo "below is output result.">>${LOG}
cat /tmp/temp.log>>${LOG}
echo "script executed successful.">>${LOG}
exit;
[root@SZDB ~]# ./shell_call_sql1.sh
Logging to file '/tmp/temp.log'
+------+-------+
| id | val |
+------+-------+
| 1 | jack |
| 2 | robin |
| 3 | mark |
+------+-------+
Outfile disabled.
2、命令行调用单独的SQL文件
代码如下:
[root@SZDB ~]# more temp.sql
tee /tmp/temp.log
drop database if exists tempdb;
create database tempdb;
use tempdb
create table if not exists tb_tmp(id smallint,val varchar(20));
insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark');
select * from tb_tmp;
notee
[root@SZDB ~]# mysql -uroot -p123456 -e "source /root/temp.sql"
Logging to file '/tmp/temp.log'
+------+-------+
| id | val |
+------+-------+
| 1 | jack |
| 2 | robin |
| 3 | mark |
+------+-------+
Outfile disabled.
3、使用管道符调用SQL文件
代码如下:
[root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql
Logging to file '/tmp/temp.log'
id val
1 jack
2 robin
3 mark
Outfile disabled.
#使用管道符调用SQL文件以及输出日志
[root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql >/tmp/temp.log
[root@SZDB ~]# more /tmp/temp.log
Logging to file '/tmp/temp.log'
id val
1 jack
2 robin
3 mark
Outfile disabled.
4、shell脚本中MySQL提示符下调用SQL
代码如下:
[root@SZDB ~]# more shell_call_sql2.sh
#!/bin/bash
mysql -uroot -p123456 <<EOF
source /root/temp.sql;
select current_date();
delete from tempdb.tb_tmp where id=3;
select * from tempdb.tb_tmp where id=2;
EOF
exit;
[root@SZDB ~]# ./shell_call_sql2.sh
Logging to file '/tmp/temp.log'
id val
1 jack
2 robin
3 mark
Outfile disabled.
current_date()
2014-10-14
id val
2 robin
5、shell脚本中变量输入与输出
代码如下:
[root@SZDB ~]# more shell_call_sql3.sh
#!/bin/bash
cmd="select count(*) from tempdb.tb_tmp"
cnt=$(mysql -uroot -p123456 -s -e "${cmd}")
echo "Current count is : ${cnt}"
exit
[root@SZDB ~]# ./shell_call_sql3.sh
Warning: Using a password on the command line interface can be insecure.
Current count is : 3
[root@SZDB ~]# echo "select count(*) from tempdb.tb_tmp"|mysql -uroot -p123456 -s
3
[root@SZDB ~]# more shell_call_sql4.sh
#!/bin/bash
id=1
cmd="select count(*) from tempdb.tb_tmp where id=${id}"
cnt=$(mysql -uroot -p123456 -s -e "${cmd}")
echo "Current count is : ${cnt}"
exit
[root@SZDB ~]# ./shell_call_sql4.sh
Current count is : 1
热心网友
时间:2022-04-08 02:06
[oracle@ls ~]$ echo "select count(*) from tab;" | sqlplus -s sys/oracle as sysdba
COUNT(*)
----------
4750
当然为了熟悉语句,练习的话,也可以直接 运行mysql 然后自己练习就好了
热心网友
时间:2022-04-08 03:40
使用终端连接工具连接进入系统当中
使用命令mysql -u 用户名 -p 密码进入到mysql当中
连接成功后即可使用sql语句来进行相关的操作
热心网友
时间:2022-04-08 05:32
首先你得安装mysql、sqlite等数据库才行,这样才能运行sql
热心网友
时间:2022-04-08 07:40
登录sqlplus就可以了。。