首页

文章

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就可以了。。
结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 linux中不能使用sql语句吗 怎么查中国电信的宽带账号? linux系统可以安装两个sql数据库吗 电信宽带服务号码是多少? linux上mysql怎样导入sql数据库文件? 怎么知道自己的中国电信宽带账号? linux下怎么装sql server 如何查电信宽带号码 linux下如何运行pl/sql 如何查看自己的电信宽带号码 在linux中,怎样打开sql中的表 电信宽带号码怎么查询 如何在linux编写sql脚本 电信宽带账号怎么查询? linux 怎么执行sql 电信宽带客服电话多少? linux下执行sql文件 电信的宽带号码在哪里找? linux怎么执行sql文件命令 宽带电话号码如何查询? 怎么查电信宽带账号 linux下怎么把.sql文件导入到MySQL数据库里,写出... 怎么查询自己电信宽带账号和密码 想学SQL和linux,希望一线工作者给我一些详细的问答... linux 下访问sql server 5G手机 荣耀v30pro和vivox30pro买哪个好? 想成为一名DBA,SQL与Linux有什么联系? vivox30 Pro,荣耀v30 Pro选哪个?拍照和外观哪个好? vivoX30和荣耀V30哪个好,请分析一下! vivox30和荣耀v30选哪个比较好?拍照和颜值哪个高 华为荣耀v30Pro,vivox30Pro手机分别怎样,大家有... vivo X30和荣耀V30哪个好? 荣耀v30和vivox30那个比较好? 荣耀v30,和vivox30哪个更好一点,参数分析!! 荣耀V30和vivox30哪个好用? vivoX30 和 荣 耀 V30 哪 个 好,请 分 析 一 下 啊! 荣耀v30对比vivox30那个好? 荣耀V30和vivoX30哪个更好一些 参数分析? 荣耀V30和vivox30推荐一下哪个性价比高? 荣耀v30和vivox30买那个?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com