重點內容:
數據庫基本概念:
????????數據(Data):能夠輸入計算機并能被計算機程序識別和處理的信息集合數據 (Database)
????????數據庫是在數據庫管理系統管理和控制之下,存放在存儲介質上的數據集合
重要概念:
????????記錄:能夠描述一條數據的完整信息稱為一個記錄(就是數據結構中的數據元素)
????????字段:描述數據中的最小不可再分割的單元(就是數據結構中的數據項)
SQLite的源代碼是C,其源代碼完全開放。SQLite第一個Alpha版本誕生于2000年5月。 他是一個輕量級的嵌入式數據庫。
SQLite有以下特性:
????????零配置 一 無需安裝和管理配置;
????????儲存在單一磁盤文件中的一個完整的數據庫;
????????數據庫文件可以在不同字節順序的機器間自由共享;
????????支持數據庫大小至2TB;
????????足夠小,全部源碼大致3萬行c代碼,250KB;
????????比目前流行的大多數數據庫對數據的操作要快;
sqlite3命令語句:
1. sqlite數據庫創建
? ? ? ? 1.sqlite3 xxx.db
? ? ? ? 2.sqlite3-->.open xxx.db
2. 系統命令,也稱為點命令????????
????????系統命令,需要以 . 開頭,不需要以 ; 結尾
????????????????.quit 退出數據庫
????????????????.exit 退出數據庫
????????????????.help 顯示幫助信息,獲取所有系統命令; ?
????????????????.table 查看當前數據庫下的所有表格;
????????????????.schema 查看表的結構
3. sql語句
1)創建表格
????????create table 表名 (字段名 數據類型, 字段名 數據類型);
????????create table if not exists 表名 (字段名 數據類型, 字段名 數據類型); ?
2)刪除表格
????????drop table 表名;
3)插入記錄
????????insert into 表名 values (數據1, 數據2, 數據3);-->全字段插入
????????insert into 表名 (字段名1, 字段名2) values (數據1, 數據2);-->部分字段插入
4)查看記錄
????????.header on 打開表頭
????????.mode column 對齊
????????select * from 表名;-->查看所有記錄
????????select * from 表名 where 限制條件;-->查看某幾行
????????select 字段1, 字段2 from 表名;-->查看某幾列
????????select 字段1, 字段2 from 表名 where 限制條件;-->查看某幾列
5)修改記錄
????????update 表名 set 字段=數值 where 限制條件; ?
6)刪除記錄
????????delete from 表名 where 限制條件; ?
7)主鍵(primary key)
????????create table 表名(字段名 數據類型 primary key, 字段名 數據類型 );
????????primary key主鍵:唯一標識表格中的每一條記錄;
8)拷貝
????????從a中拷貝所有數據到b中: create table b as select * from a;
????????從a中拷貝指定字段到b中: create table b as select 字段,字段,字段 from a; ?
9)增加列????????
????????alter table 表名 add column 字段名 數據類型;
10)修改表名
????????alter table 舊表名 rename to 新表名;
11)修改字段名(列名)
????????不支持直接修改列名
????????1.將表重新命名(a改成b) alter table stuinfo rename to stu;
????????2.新建修改名字后的表(新建一個a) create table stuinfo (name char, age1 int, sex char, score int);
????????3.從舊表b中取出數據,插入到新表a中; insert into stuinfo select * from stu;
12)刪除列
????????不支持直接刪除列;
????????1.創建一個新表b,并復制舊表a需要保留的字段信息; create table stu as select name, age1, sex from stuinfo;
???????? 2.刪除舊表a; drop table stuinfo;
????????3.修改新表b的名字a; alter table stu rename to stuinfo;
sqlite3 API:
1. sqlite3的C - APIs
1)sqlite3_open
????????int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );
????????功能:打開一個數據庫,如果數據庫不存在,則創建一個數據庫并打開
????????參數1:要打開的數據庫的名字,是一個字符串
????????參數2:數據庫操作句柄,是一個二級指針,需要我們傳入一級指針的地址,如果打開數據庫成功,則數據庫指針由該參數返回
????????返回值:成功返回SQLITE_OK,失敗返回一個錯誤碼(非linux的錯誤碼),可以使用sqlite3_errmsg來獲取錯誤信息,由sqlite3_errcode返回錯誤碼值
????????注意:無論打開數據庫是否成功,在不使用數據庫時都應該使用sqlite3_close將其關閉
2)sqlite3_close
????????int sqlite3_close(sqlite3*);
????????功能:關閉數據庫,斷開句柄所擁有的資源
????????參數:數據庫指針
????????返回值:成功返回SQLITE_OK,失敗返回其他錯誤碼
3)sqlite3_errmsg
????????const char *sqlite3_errmsg(sqlite3*);
????????功能:通過出錯的句柄返回錯誤信息
????????參數:出錯的句柄
????????返回值:對應的錯誤信息,是一個字符串
4)sqlite3_errcode
????????int sqlite3_errcode(sqlite3 *db)
????????功能:通過錯誤句柄返回錯誤碼
????????參數:錯誤句柄
????????返回值:錯誤碼
5)sqlite3_exec
????????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語句
????????參數1:已經被打開的數據庫句柄
????????參數2:要執行的sql語句
????????參數3:回調函數,主要用于數據庫查找時,處理查找的結果集的函數,如果不需要處理sql語句的結果,則填NULL即可
????????參數4:參數3的第一個參數
????????參數5:錯誤信息 返回值:成功返回SQLITE_OK,失敗返回其他錯誤碼
6)回調函數
????????int callback(void* arg,int cols, char** msgtext, char** msgheader)
????????功能:回調函數,對于sql語句執行后的每一個記錄行執行該回調函數
????????參數1:exec傳遞進來的參數
????????參數2:當前要處理的結果行的總列數
????????參數3:當前結果行信息的起始地址
????????參數4:當前結果行表頭的起始地址
????????返回值:成功返回0,失敗返回-1;
7)sqlite3_get_table
????????onst char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ );
功能:通過執行sql語句,得到結果集中的內容
????????參數1:數據庫句柄
????????參數2:要執行的sql語句
????????參數3:查詢結果的起始地址,需要定義一個二級指針變量,將地址進行傳遞
????????參數4: 查詢結果的行數(不包括表頭)
????????參數5:查詢結果的列數
????????參數6:錯誤信息
????????返回值:成功返回SQLITE_OK,失敗返回非0的錯誤碼
8)sqltie3_free_table
????????void sqlite3_free_table(char **result);
????????功能:釋放表的空間
????????參數:通過sql語句查詢的結果
作業:
1> 實現一個XXX管理系統
程序源碼:
#include <25072head.h>
//定義添加學生信息函數
int do_add(sqlite3 *ppDb)
{
int add_id; ? ? ? ? ?//要添加的id號
char add_name[20]; ? //要添加的姓名
double add_score; ? ?//要添加的成績? ? printf("請輸入要添加學生的學號:");
scanf("%d", &add_id);
printf("請輸入要添加學生的姓名:");
scanf("%s", add_name);
printf("請輸入要添加學生的成績:");
scanf("%lf", &add_score);
getchar();
//準備sql語句
char sql[128] = "";
sprintf(sql ,"insert into stuinfo values(%d, \"%s\",%.2lf);", \
add_id,add_name,add_score);
//執行sql語句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("添加失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("添加成功\n");
}
return 0;
}
int do_delete(sqlite3 *ppDb)
{
int delete_id; ? ? ? ? ? ? ? ? ? ? //要刪除的id號
printf("請輸入要刪除學生的學號"); ?
scanf("%d",&delete_id);
getchar();
//準備sql語句
char sql[128]="";
sprintf(sql,"delete from stuinfo where id=%d;",delete_id);
//執行sql語句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("刪除失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("刪除成功\n");
}
return 0;
}
int do_update(sqlite3 *ppDb)
{
int update_id; ? ? ? ? ?//要修改的id號
char update_name[20]; ? //要修改的姓名
double update_score; ? ?//要修改的成績
printf("請輸入要修改學生的學號:");
scanf("%d", &update_id);
printf("請輸入修改后的學生姓名:");
scanf("%s", update_name);
printf("請輸入修改后的學生成績:");
scanf("%lf", &update_score);
getchar();
//準備sql語句
char sql[128]="";
sprintf(sql,"update stuinfo set name=\"%s\",score=%.2lf where id=%d;",update_name,update_score,update_id);
//執行sql語句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("修改失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("修改成功\n");
}
return 0;
}
//自定義查詢函數的回調函數
int callback(void *arg, int cols, char **msgtext, char **msgheader)
{
if( *(int *)arg ==0)
{
//先輸出表頭
for(int i=0; i<cols; i++)
{
printf("%s\t", msgheader[i]);
}
printf("\n");
*(int *)arg = 1;
}
//輸出內容
for(int i=0; i<cols; i++)
{
printf("%s\t", msgtext[i]);
}
printf("\n");
return 0;
}
//定義查找函數
int do_search(sqlite3 *ppDb)
{
//1.準備sql語句
char *sql = "select * from stuinfo;";
//2.執行sql語句
char *errmsg = NULL;
int flag = 0;
if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("查詢失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
printf("查詢成功\n");
return 0;
}
int main(int argc, const char *argv[])
{
//1,打開數據庫并返回一個操作該數據庫的句柄
sqlite3 * ppDb=NULL;
if(sqlite3_open("./my.db",&ppDb)!=SQLITE_OK)
{
printf("my.db open error errcode=%d,errmsg=%s\n",\
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
return -1;
}
//程序執行至此,后期可以使用ppDb指針,進行數據庫操作了
//創建一個學生信息表
char *sql="create table if not exists stuinfo(id int primary key,\
name text not NULL,score double);";
//定義指針接收執行sql語句后的錯誤信息
char *errmsg=NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("創建數據表失敗:%s\n",errmsg);
sqlite3_free(errmsg);
errmsg=NULL;
return -1;
}
printf("學生信息表創建成功!\n");
int menu = -1;
while(1)
{
system("clear"); ? ? ? ? ? //執行系統終端指令
printf("\t\t==============XXX學生管理系統=============\n");
printf("\t\t==============1、增=======================\n");
printf("\t\t==============2、刪=======================\n");
printf("\t\t==============3、改=======================\n");
printf("\t\t==============4、查=======================\n");
printf("\t\t==============0、退出=======================\n");
printf("請輸入功能:");
scanf("%d", &menu);
getchar();
//多分支選擇
switch(menu)
{
case 1:
{
do_add(ppDb);
}
break;? ? ? ? case 2:
{
do_delete(ppDb);
}
break;? ? ? ? case 3:
{
do_update(ppDb);
}
break;
case 4:
{
do_search(ppDb);
}
break;
case 0: exit(EXIT_SUCCESS);
default:printf("輸入有錯,請重新輸入\n");
}
printf("按任意鍵后,按回車清屏\n");
while(getchar() != '\n');
}
//關閉數據庫
sqlite3_close(ppDb);
return 0;
}
2> 思維導圖
3> 牛客網