目录
一. 数据库的概念
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。
二. 常用的数据库
大型数据库 :Oracle
中型数据库 :Server是微软开发的数据库产品,主要支持windows平台
小型数据库 : mySQL是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据)
mySQL与SQLite区别:MySQL和SQLite是两种不同的数据库管理系统,它们在多个方面有所不同。
1. 性能和规模:MySQL通常用于大型应用程序和网站,它可以处理大量数据和高并发访问。SQLite则更适合于小型应用程序或移动设备,因为它是一个轻量级的数据库引擎,不需要独立的服务器进程,可以直接访问本地文件。
2. 部署和配置:MySQL需要单独的服务器进程来运行,需要配置和管理数据库服务器。而SQLite是一个嵌入式数据库,可以直接嵌入到应用程序中,不需要单独的服务器进程。
3. 功能和特性:MySQL提供了更多的功能和高级特性,比如存储过程、触发器、复制和集群支持等。SQLite则是一个轻量级的数据库引擎,功能相对较少,但对于简单的数据存储和检索已经足够。
4. 跨平台支持:SQLite在各种操作系统上都能够运行,而MySQL需要在特定的操作系统上安装和配置数据库服务器。
总之,MySQL适用于大型应用程序和网站,需要处理大量数据和高并发访问,而SQLite适用于小型应用程序或移动设备,对性能和规模要求没有那么高。
三. SQL基础
SQLite的源代码是C,其源代码完全开放。它是一个轻量级的嵌入式数据库。
SQLite有以下特性:
零配置一无需安装和管理配置;
储存在单一磁盘文件中的一个完整的数据库;
数据库文件可以在不同字节顺序的机器间自由共享;
支持数据库大小至2TB(1024G = 1TB);//嵌入式足够
足够小,全部源码大致3万行c代码,250KB;
比目前流行的大多数数据库对数据的操作要快;
四. SQL语句的使用
1.打开数据库
int sqlite3_open(char *path, sqlite3 **db);
功能:打开sqlite数据库,如果数据库不存在则创建它
参数:path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK(0),失败返回错误码(非零值)
2.返回错误信息
char *sqlite3_errmsg(sqlite3 *db);
功能: 获取错误信息
返回值:返回错误信息
使用: fprintf(stderr,"sqlite3_open failed %s\n",sqlite3_errmsg(db));
3.关闭数据库
int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码
4.执行sql语句
int sqlite3_exec(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功能:执行SQL操作
参数:db:数据库句柄
sql:要执行SQL语句
callback:回调函数(满足一次条件,调用一次函数,用于查询)
再调用查询sql语句的时候使用回调函数打印查询到的数据
arg:传递给回调函数的参数
errmsg:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码
回调函数:
typedef int (*sqlite3_callback)(void *para, int f_num,
char **f_value, char **f_name);
功能:select:每找到一条记录自动执行一次回调函数
参数:para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来)
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组(列值)
f_name:包含每个字段名称的指针数组(列名)
返回值:成功返回SQLITE_OK,失败返回-1,每次回调必须返回0后才能继续下次回调
不使用回调函数执行SQL语句(只用于查询)
int sqlite3_get_table(sqlite3 *db, const char *sql,
char ***resultp, int *nrow, int *ncolumn, char **errmsg);
功能:执行SQL操作
参数:db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目(但是不包含字段名(表头 id name score))
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码
#include <stdio.h>
#include <sqlite3.h>
int callback(void *buf, int num, char **value, char **name);
int main(int argc, char const *argv[])
{
sqlite3 *db;
// 1.打开数据库
if (sqlite3_open("./stu.db", &db) != SQLITE_OK)
{
// 打印错误信息
fprintf(stderr, "open err:%s\n", sqlite3_errmsg(db));
return -1;
}
// 数据库的操作
char *errmsg = NULL;
if (sqlite3_exec(db, "create table if not exists stu(id int ,name char, score float);", NULL, NULL, &errmsg) != 0)
{
fprintf(stderr, "create err:%s\n", errmsg);
return -1;
}
printf("create table okk\n");
// 插入数据
/*
if (sqlite3_exec(db, "insert into stu values(1,'huanhuan',99.99)", NULL, NULL, &errmsg) != 0)
{
fprintf(stderr, "insert err:%s\n", errmsg);
return -1;
}
printf("insert okk\n");
*/
int num;
printf("请输入学生人数");
scanf("%d", &num);
int id;
char name[32] = {0};
float score;
char sql[128] = {0};
for (int i = 0; i < num; i++)
{
printf("请输入学生学号 姓名 成绩:");
scanf("%d %s %f", &id, name, &score);
sprintf(sql, "insert into stu values(%d,'%s',%f)", id, name, score);
if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0)
{
fprintf(stderr, "insert err:%s\n", errmsg);
return -1;
}
printf("insert okk\n");
}
// 查询数据
/**/
if (sqlite3_exec(db, "select * from stu ;", callback, "hello", &errmsg) != 0)
{
fprintf(stderr, "select err:%s\n", errmsg);
return -1;
}
printf("select okk\n");
// 专门用于查询数据的函数:sqlite3_get_table
// row:行
// column:列
char **result = NULL;
int row = 0, column = 0;
sqlite3_get_table(db, "select * from stu ;", &result, &row, &column, &errmsg);
int k = 0;
printf("row:%d column:%d\n",row,column);
for (int i = 0; i <= row; i++)
{
for (int j = 0; j < column; j++)
printf("%s ", result[k++]);
putchar(10);
}
// 关闭
sqlite3_close(db);
return 0;
}
int callback(void *buf, int num, char **value, char **name)
{
// 每查询到一条符合条件的数据就会调用一次函数
static int i = 1;
printf("%s:%d\n", (char *)buf, i++);
// num:列数
// value:值
// name:列名
for (int j = 0; j < num; j++)
{
printf("%s ", name[j]);
}
putchar(10);
for (int j = 0; j < num; j++)
{
printf("%s ", value[j]);
}
putchar(10);
printf("***************************************\n");
return 0; // 必须存在,不然sqlite_exec函数会报错
}
59
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » sql数据库
发表评论 取消回复