目录
数据库的基本概念和常用数据库
数据库的基本概念:
- 数据库(Database):是一个按照规定格式存储数据的仓库。
- 数据库管理系统(Database Management System,DBMS):是一种允许用户定义、创建、维护和控制访问数据库的软件系统。
- 数据表(Table):是由行和列组成的二维表格,是数据库中的基本存储单元。
- 字段(Field):表中列的属性,表示一个数据的特定部分。
- 记录(Record):表中的一行数据。
- 主键(Primary Key):表中唯一标识每个记录的字段。
- 外键(Foreign Key):用于建立两个或多个表之间的关系。
- 索引(Index):用于加快数据的检索速度,类似于书的目录。
常用的数据库:
- MySQL:是一款免费开源的关系型数据库管理系统,被广泛应用于互联网应用领域。
- Oracle:是一款商业关系型数据库管理系统,具有高性能、高可靠和高安全性等优点。
- SQL Server:是微软公司开发的关系型数据库管理系统,适用于大型企业应用。
- MongoDB:是一款基于文档的NoSQL数据库,具有高可扩展性和灵活性。
- PostgreSQL:是一款开源的关系型数据库管理系统,具有高度的可扩展性和安全性。
- sqilte:是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作,非常适用嵌入式开发。
sqlite介绍
SQLite 是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作。SQLite 主要包括以下几个概念:
-
数据库文件:SQLite 基于文件的方式进行存储,每个数据库对应一个文件,文件以 .db 为后缀名。数据库文件中包含了一个或多个表,表包含了多个数据行。
-
表:表是 SQLite 中的基本数据存储单位。一个表由多个字段组成,每个字段对应表中一列数据。
-
字段:表中的每个列称为一个字段,字段包含了数据的类型、长度等信息。
-
数据行:表中的每一行称为一个数据行,每个数据行包含了对应字段的数据。
-
主键:每个表都必须有一个主键,用来唯一标识表中的每行数据。主键可以是一个或多个字段的组合。在 SQLite 中,每个表可以自动创建一个名为 “rowid” 的隐藏字段作为主键。
-
SQL:SQL(Structured Query Language)是一种用于管理关系型数据库的语言。SQLite 也支持 SQL,可以使用 SQL 对数据库进行查询、插入、更新、删除等操作。
sqlite安装步骤
以下是在Ubuntu上安装SQLite的步骤:
-
打开终端窗口。
-
通过以下命令更新Ubuntu软件包列表:
sudo apt-get update
-
安装SQLite软件包:
sudo apt-get install sqlite3
-
等待安装完成。
-
检查SQLite是否成功安装:
sqlite3 --version
如果SQLite版本号被显示出来,说明SQLite已经成功安装。
安装可视化工具
sudo apt-get install sqlitebrowser
sqlite常用命令
下面是SQLite常用的系统命令:
-
.help
:查询SQLite帮助信息。 -
.tables
:列出当前数据库中的所有表。 -
.schema
:列出指定表的架构。 -
.header on|off
:打开或关闭输出的列头。 -
.mode MODE
:设置输出模式,如:line
、column
、list
。 -
.show
:显示当前的设置参数。 -
.quit
:退出SQLite命令行界面。 -
.backup FILENAME
:备份数据库,将当前数据库备份到指定文件中。 -
.restore FILENAME
:恢复备份的数据库。 -
.dump
:将整个数据库导出为SQL脚本。 -
.timeout MS
:设置命令的超时时间。 -
.echo on|off
:打开或关闭命令行输出。 -
.explain on|off
:打开或关闭查询计划的输出。 -
.separator STRING
:设置输出分隔符。 -
.import FILE TABLE
:将指定文件中的数据导入到指定表中。 -
.exit 退出.
注意:命令前面需要加一个英文的.
,表示这是一个系统命令。
下面是sqlite常用的sql语句:
-
创建表:CREATE TABLE table_name (column1 datatype, column2 datatype, column3 datatype, ...);
-
插入数据:INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
-
修改数据:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
-
删除数据:DELETE FROM table_name WHERE condition;
-
查询数据:SELECT column1, column2, ... FROM table_name WHERE condition;
-
聚合函数:SELECT COUNT(column_name), AVG(column_name), SUM(column_name), MAX(column_name), MIN(column_name) FROM table_name;
-
排序:SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];
-
分组:SELECT column1, column2, ... FROM table_name GROUP BY column_name;
-
连接查询:SELECT column1, column2, ... FROM table_name1 INNER/LEFT/RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;
-
子查询:SELECT column1, column2, ... FROM table_name WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);
sqlite3的C语言的API函数详解
SQLite是一个轻量级的嵌入式数据库,它的API函数非常简单易用,以下是它的C语言API函数详解和参数定义:
1.sqlite3_open - 打开一个数据库
函数原型:int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数说明:
- filename:要打开的数据库文件名。
- ppDb:指向sqlite3 *类型的指针的指针,用于存储打开的数据库的句柄。
返回值:
- 成功返回SQLITE_OK,否则返回其他错误码。
2.sqlite3_close - 关闭一个数据库
函数原型:int sqlite3_close(sqlite3 *db);
参数说明:
- db:要关闭的数据库句柄。
返回值:
- 成功返回SQLITE_OK,否则返回其他错误码。
3.sqlite3_exec是一个SQLite C API中的函数,它可以执行一个或多个SQL语句并返回结果,使用简单方便。
函数原型:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be executed */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数列表:
- sqlite3 *db:已打开的SQLite数据库句柄;
- const char *sql:要执行的SQL语句;
- int (callback)(void,int,char**,char**):回调函数指针(可选参数);
- void *:回调函数的第一个参数(可选参数);
- char **errmsg:如果出现错误,错误信息将被记录在这个指针指向的变量中。
返回值:
- 如果执行成功,则返回 SQLITE_OK;
- 如果执行出错,则返回错误代码,返回码的列表可以在文档中查找。
使用方法:
下面是一个使用sqlite3_exec函数执行SELECT语句的示例:
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char** argv)
{
sqlite3* db;
char* sql;
char* errmsg;
int ret;
sqlite3_stmt* stmt;
const char* tail;
const unsigned char* val;
// 打开数据库
ret = sqlite3_open("test.db", &db);
if (ret != SQLITE_OK)
{
printf("open database fail:%s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
// 执行查询语句,返回结果集
sql = "SELECT * FROM t_user";
ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (ret != SQLITE_OK)
{
printf("exec sql fail: %s\n", errmsg);
sqlite3_free(errmsg);
sqlite3_close(db);
return -1;
}
// 取出查询结果集的值并输出
while (sqlite3_step(stmt) == SQLITE_ROW)
{
val = sqlite3_column_text(stmt, 0);
printf("%s\n", val);
}
// 释放资源
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
#include <sqlite3.h>
#include <iostream>
int callback(void* data, int argc, char** argv, char** azColName) {
std::cout << "Callback function called." << std::endl;
for(int i = 0; i < argc; i++) {
std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;
}
return 0;
}
int main() {
sqlite3* db;
char* zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if(rc) {
std::cout << "Can't open database: " << sqlite3_errmsg(db) << std::endl;
return(0);
} else {
std::cout << "Database opened successfully." << std::endl;
}
const char* sql = "CREATE TABLE COMPANY("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL);";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if(rc != SQLITE_OK) {
std::cout << "SQL error: " << zErrMsg << std::endl;
sqlite3_free(zErrMsg);
} else {
std::cout << "Table created successfully." << std::endl;
}
sqlite3_close(db);
return 0;
}
回调函数详解:
int (*callback)(void*, int, char**, char**);
其中,第一个参数是一个指针,通常用于传递应用程序自定义的数据;第二个参数是结果集中当前行的列数;第三个参数是当前行的值;第四个参数是当前行的列名。回调函数的返回值是整数类型,如果返回非0值,那么sqlite3_exec将停止执行后续的SQL语句。
sqlite3使用项目案例
假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将这些信息保存在数据库中
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
#define DATABASE "fruit.db"
void do_stock(sqlite3 *);
void do_sell(sqlite3 *);
void do_select_in(sqlite3 *);
void do_select_avg(sqlite3 *);
void do_select_stock_list(sqlite3 *);
void do_select_sell_list(sqlite3 *);
int main(int argc, const char *argv[])
{
sqlite3 *db;
int ret;
char *msgerr;
if (sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("open database failed %s\n", sqlite3_errmsg(db));
exit(0);
}else{
printf("open database success\n");
}
// 创建进货表和卖出表和库存表
if(sqlite3_exec(db, "create table if not exists fruit_stock(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){
printf("%s", msgerr);
exit(0);
}
if(sqlite3_exec(db, "create table if not exists fruit_sell(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){
printf("%s", msgerr);
exit(0);
}
if(sqlite3_exec(db, "create table if not exists fruit_in(id integer primary key autoincrement, name char, number int);", NULL, NULL, &msgerr) != SQLITE_OK ){
printf("%s", msgerr);
exit(0);
}
//
while(1){
printf("*****************************************************************************************\n");
printf("1:fruit_stock 2:fruit_sell 3:select_in 4:select_frult_avg 5:stock_list 6:sell_list 7:exit\n");
printf("*****************************************************************************************\n");
printf("please select:");
scanf("%d", &ret);
getchar();
switch(ret){
case 1:
//进货
do_stock(db);
break;
case 2:
//出货
do_sell(db);
break;
case 3:
// 查询库存
do_select_in(db);
break;
case 4:
// 查询卖出水果平均价格
do_select_avg(db);
break;
case 5:
// 查询出货记录
do_select_stock_list(db);
break;
case 6:
// 查询入库记录
do_select_sell_list(db);
break;
case 7:
// 退出
sqlite3_close(db);
exit(0);
}
}
return 0;
}
void do_stock(sqlite3 * db){
char sql[512];
char name[32];
float price;
int number;
char ntime[64];
time_t now;
struct tm *st;
char *msgerr;
printf("input fruit stock name:");
scanf("%s", name);
getchar();
printf("input fruit stock price:");
scanf("%f", &price);
getchar();
printf("input fruit stock number:");
scanf("%d", &number);
getchar();
now = time(NULL);
st = localtime(&now);
strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);
sprintf(sql, "insert into fruit_stock(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);
if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("stock done success\n");
}
memset(sql, 0, 512);
sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') + %d where name='%s';", name, number, name);
//printf("sql ==== %s\n", sql);
if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("update fruit_in success\n");
}
return ;
}
void do_sell(sqlite3 * db){
char sql[512];
char name[32];
float price;
int number;
char ntime[64];
time_t now;
struct tm *st;
char *msgerr;
printf("input fruit stock name:");
scanf("%s", name);
printf("input fruit stock price:");
scanf("%f", &price);
printf("input fruit stock number:");
scanf("%d", &number);
st = localtime(&now);
strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);
sprintf(sql, "insert into fruit_sell(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);
//printf("sql ==== %s\n", sql);
if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("stock done success\n");
}
memset(sql, 0, 512);
sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') - %d where name='%s';", name, number, name);
//printf("sql ==== %s\n", sql);
if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("update fruit_in success\n");
}
return ;
}
int callback(void *arg, int f_num, char **f_val, char **f_name){
int i;
for (i=0; i < f_num; i++){
printf("%-8s", f_val[i]);
}
printf("\n");
return 0;
}
void do_select_in(sqlite3 *db){
char sql[512];
char *msgerr;
sprintf(sql, "select name ,number from fruit_in;");
printf("name number\n");
if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("select fruit_in success\n");
}
}
void do_select_avg(sqlite3 *db){
char sql[512];
char *msgerr;
sprintf(sql, "select name, avg(price) from fruit_sell group by name;");
printf("%s\n",sql);
if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("select fruit_sell success\n");
}
}
void do_select_stock_list(sqlite3 *db){
char sql[512];
char *msgerr;
sprintf(sql, "select name, price, time from fruit_stock;");
printf("%s\n",sql);
if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("select fruit_stock success\n");
}
}
void do_select_sell_list(sqlite3 *db){
char sql[512];
char *msgerr;
sprintf(sql, "select name, price, time from fruit_sell;");
printf("%s\n",sql);
if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)
printf("%s\n", msgerr);
else{
printf("select fruit_in is avg success\n");
}
}