數據庫
?? ??? ?sun
?? ??? ?solaris ?gnu
1、分類: 大型 ? ?中型 ? ??? ??? ?小型
?? ??? ? ORACLE ? MYSQL/MSSQL ? SQLITE ?DBII powdb
?? ??? ?關系型數據庫 ? ? ? ?
2、名詞:
?? ??? ?DB?? ??? ?數據庫 select update database
?? ??? ?DBMS?? ?數據庫管理系統
?? ??? ?MIS ? ? 管理信息系統
?? ??? ?OA ? ? ?辦公自動化
3、嵌入式數據庫:
?? ??? ?sqlite3 ? ?www.sqlite.org ?www.kernal.org
?? ?GNU ??
?? ?特點:
?? ??? ? ?1、開源 ?C語言開發
?? ??? ? ?2、代碼量少 1萬行左右,總大小10M以內
?? ??? ? ?3、綠色軟件無需安裝
?? ??? ? ?4、文件型數據庫,可以移動。
?? ??? ? ?5、數據容量最大 2T ??
?? ??? ? ?
whereis sqlite3
sqlite3:
4、sqlite3的安裝: LTS long term support?
??? ?1、在線安裝 :
?? ??? ??? ??? ?sudo apt-get install sqlite3?
?? ??? ??? ??? ?sudo apt-get install libsqlite3-dev
?? ?
?? ??? ?gcc test.c -lsqlite3 -lpthread
?? ??? ?
?? ?2、驗證是否安裝成功:
?? ??? ?sqlite3 --version
?? ??? ?sqlite3 --help
5、sqlite3的使用:
?? ?0、啟動sqlite3?
?? ??? ??? ?sqlite3 xxx.db ?
?? ??? ??? ?===>用sqlite3 來打開一個名稱為test.db的本地數據庫。
?? ??? ??? ?出現如下提示符:表明數據庫管理系統啟動。
?? ??? ??? ?sqlite>?
?? ? ??? ??? ?退出數據庫:?
?? ? ? ?? ??? ?.q 命令
?? ??? ??? ?
?? ??? ??? ?注意:如果一直出現如下符號:
?? ??? ??? ?...> ??
?? ??? ??? ?則寫';'結束。
?? ?以下所有命令必須在 sqlite> 后執行。
?? ?創建一個數據庫:
?? ??? ?1、touch ?xxx.db
?? ??? ?2、sqlite3 xxx.db
?? ?1、系統維護命令:===> .help
?? ??? ?出現所有相關的系統維護命令,都是以 "."開頭。
?? ??? ?.database ?列出當前庫和系統中那個文件在關聯
?? ??? ?.tables ? ?列出當期數據庫中的所有表
?? ??? ?.schema xxx 列出當前指定的xxx表結構
?? ??? ?.dump user ? ===>導出數據庫
?? ??? ?重定向
?? ??? ?sqlite3 test.db .dump > 123.sql
?? ??? ?sqlite3 xxx.db < test.sql ===>導入數據庫
?? ??? ?
?? ?2、標準SQL語句:===》通用語法在其他平臺可以直接使用。struct query language;
?? ??? ?注意:所有的sql語句都以';'結尾。
?? ??? ?創建一個表:ddl
?? ??? ?create table ?表名(表字段1,表字段2,...);
?? ??? ?eg: create table user(id,name,age);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? char (有長度限制)字符串
?? ??? ?注意:以上表的表字段,支持如下數據類型。int? ? ? ? ? ?text? ? ? ? ? ?real? ? ? ? ? blob(照片)
?? ??? ??? ? ?默認是text類型。char;
?? ??? ?create table 表名 (表字段 類型,表字段 類型,。。。。);
?? ??? ?eg:
?? ??? ?create table user(id int ?,name char,age int);
刪除一個表:
?? ??? ?drop table ?表名;
?? ??? ?eg:drop table user;
?? ? ? 數據庫常規操作: 增加 刪除 修改 查詢
?? ? ?
向表中增加數據:
?? ? ? insert into 表名 (字段名稱 ) values (值名稱);
?? ? ? eg:insert into user (id,age)? ? values (1,10);
?? ? ? insert into user values(3,"wang",11);
?? ? ? insert into user (age) values ( 12);
?查詢表中的數據:
?? ? ? select 列名 from 表名 ?條件;
?? ? ? eg:select * from user ; 查詢有多少列
?? ? ? ? ? select id from user;只取某幾列:
?? ??? ? ? select id,name from user where not ?age <30
?? ??? ? ? where name ? like '三一' ? % _ 通配符?
查詢創建的表中是什么類型 :? ?.schema
要是想在查詢的列最上面顯示類型: .headers on
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?asc
?? ??? ? ? select *from user where age>20 or age<50 order by age desc limit 2 ;
?? ??? ? ? && ?||
用like 查詢通配符,=查看具體哪個re'e
%和_是0到任意多個字符? 通配符
?
?? ? ? 修改表中數據:
?? ? ? update 表名 set 表字段 = 值 ?滿足條件:
?? ? ? eg: update user set id = 1 where name = 'li';
?? ? ? update user set id = 1 where name = "li" and passwd = "123";
?? ? ? update user set id = 2 where name = "li" or ?name = "zhao";
?? ??
?? ? ?
刪除表中數據:
?? ? ? delete from 表名 ?滿足條件:
?? ? ? eg:delete from user ; ?///刪除表中所有數據
?? ? ? ?? ? ? delete from user where id ?= 1; ///刪除id=1 的數據;
?? ??? ? ? delete from user where id =1 and name = "zhang";
?? ??? ? ? delete from user where id = 1 or id ?= 2;
?? ??? ??
?? ?>2022-1-1 and <2018-12-31
插入時間列 int int;
?? ?unicode
?? ?CREATE TABLE user1(id int,name char,age int,dt datetime);
、'2022-07-01 19:00:00'
?? ?insert into user1 values (2,'張三',23,datetime('now','+8 hours'));
自動增長列
?? ?sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); ?主鍵?
sqlite> insert into user3 (NULL,'李四',23,datetime('now')); ? (void*)0
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?asc?
?? ?where (group by having) order by [desc] limit;
?? ?select * from user where id<10 order by id limit 2; ?
維護命令:
1、數據的導出:
?? ??? ?sqlite3 xxx.db .dump > xxx.sql
?? ?//將數據庫名稱為xxx的數據庫整體導出到腳本中。
? ? “>”輸出重定向
?
2、數據的導入:
?? ??? ?sqlite3 xxx.db < xxx.sql
“<”輸出重定向
3、可視化工具安裝:s
?? ?sudo apt-get install sqlitebrowser?
?? ?
?? ?
==================================================
sqlite3 數據庫編程接口:
1、需要的頭文件
?? ??? ?sqlite3.h
2、編譯過程
?? ??? ?-lsqlite3
3、編程框架:
打開數據庫 ==》讀寫數據庫(增,刪,改,查) ==》關閉數據庫
sqlite3.h
3.1 打開數據庫: sqlite3_open
? ? int sqlite3_open(char * path,sqlite3 ** db);
?? ?功能:打開指定path路徑+文件名稱的數據庫,并將
?? ??? ? ?打開的地址指向db變量的句柄。
?? ?參數:path 要打開的數據庫路徑+名稱
?? ??? ? ?db ?要打開的數據庫地址指針
?? ?返回值:成功 ?0
?? ??? ??? ?失敗 ?-1;
3.2 關閉數據庫: sqlite3_close
?? ?int sqlite3_close(sqlite3 *db);
?? ?功能:關閉指定的數據庫
?? ?參數:要關閉的數據庫地址
?? ?返回值:成功 ?0
?? ??? ??? ?失敗 ?-1;
3.3 數據庫操作:
?? ?查詢操作:sqlite3_get_table(); ?select?
?? ?int sqlite3_get_table(sqlite3 *db,char *sql,
?? ??? ??? ??? ??? ?char *** rest,int *nrow,int *ncol,
?? ??? ??? ??? ??? ?char ** errmsg);
?? ?功能:在db數據庫上執行sql查詢語句,并將執行的
?? ??? ? ?結果集返回到rest地址上,同時返回查詢的行和列。
?? ?參數:db 要執行查詢語句的數據庫
?? ? ? ? ?sql ?要執行的select查詢語句
?? ??? ? ?rest 查詢的結果集是一個三級指針
?? ??? ? ?nrow 查詢的結果的行數
?? ??? ? ?ncol 查詢的結果的列數
?? ??? ? ?errmsg 如果執行有錯誤,則存儲錯誤。
?? ?返回值:成功 0
?? ??? ??? ?失敗 非0;
?? ?執行sql語句:sqlite3_exec(); ? insert delete update
?? ?int sqlite3_exec(sqlite3 *db,char *sql,callback fun,
?? ??? ??? ??? ??? ?void * arg,char ** errmsg);
?? ?功能:在db數據庫上執行sql 非查詢語句。
?? ??? ? ?并將結果返回。
?? ?參數:db 要執行sql的數據庫
?? ??? ? ?sql ?要執行的非查詢sql語句。
?? ??? ? ?fun ?如果該函數要執行查詢語句,則該回調函數
?? ??? ? ??? ? ? 用來回收查詢的結果。
?? ??? ? ?arg ?回調函數的參數,如果沒有回調函數則該參數為NULL;
?? ??? ? ?errmsg ?執行過程中的錯誤信息。
?? ?返回值:執行成功 ?0
?? ??? ??? ?失敗 ?非0 ;
?? ?int fun(void *arg ,int f_num,char ** f_value,
?? ? ? ? ? ?char ** f_name)
?? ?
?? ?功能:該函數用于sqlite3_exec執行select語句的
?? ??? ? ?結果集返回數據。
?? ?參數:arg 由sqlite3_exec傳入的參數
?? ??? ? ?f_num 執行該命令所返回測結果集的字段個數。
?? ??? ? ?f_value 查詢結果集中的字段的值。
?? ??? ? ?f_name ?查詢結果集中的字段的名稱。
?? ?返回值:成功 0
?? ??? ??? ?失敗 非0
?? ?注意:該回調函數必須有返回值,否則可能導致查詢異常。
#include <stdio.h> // 引入標準輸入輸出庫
#include <stdlib.h> // 引入標準庫,用于動態內存分配、程序控制等
#include <sqlite3.h> // 引入SQLite3庫的頭文件 int main(int argc, char *argv[])
{ sqlite3* db; // 聲明一個指向sqlite3結構體的指針,用于存儲數據庫連接 // 嘗試打開數據庫文件aaa.db,如果文件不存在則創建它 // sqlite3_open的第二個參數是指向sqlite3*的指針的地址,用于存儲數據庫連接 int ret = sqlite3_open("aaa.db",&db); if(SQLITE_OK != ret) // 如果打開失敗 { // 使用sqlite3_errmsg獲取錯誤信息,并打印到標準錯誤輸出 fprintf(stderr,"open db error:%s\n",sqlite3_errmsg(db)); // 無論成功與否,都需要關閉數據庫連接 sqlite3_close(db); // 返回錯誤代碼1表示程序異常退出 return 1; } // 準備要執行的SQL命令,這里是一個插入命令 char sql_cmd[256]="insert into user values(8,'zhaosi',12);"; // 聲明一個用于接收SQL執行后可能產生的錯誤信息的指針 char * errmsg; // 執行SQL命令 // sqlite3_exec的第四個參數和第五個參數是回調函數和數據指針,這里都不需要,所以設為NULL // 第五個參數是指向錯誤信息的指針的地址,用于接收可能產生的錯誤信息 ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg); if(SQLITE_OK != ret) // 如果執行失敗 { // 打印錯誤信息到標準錯誤輸出 fprintf(stderr,"exec sqlcmd error:%s\n",errmsg); // 使用sqlite3_free釋放sqlite3_exec分配的錯誤信息內存 sqlite3_free(errmsg); // 關閉數據庫連接 sqlite3_close(db); // 返回錯誤代碼1表示程序異常退出 return 1; } // 如果一切順利,則關閉數據庫連接 sqlite3_close(db); // 程序正常退出 return 0;
}
練習:自己創建一個學生表,最少不能低于3個字段
?? ? ?最好有一個唯一主鍵,
?? ? ?設計程序以代碼方式,依次輸入5個學生信息
?? ? ?并存儲到數據庫中,最終查詢顯示所有學習信息。
?? ? ?id(主鍵,自動),name,age,addr,datetime,recommand;
?? ? ?
?? ? ?至少插入5條記錄。
?? ? ?
?? ? ?修改3處。
?? ? ?
?? ? ?刪除2條記錄。
?? ? ?
給數據庫表添加主鍵:
1、sqliteman 設計表過程中選擇 ;PK INTER
2、SQL 語句:
? ?create table user(id int primary key,name text);
?? ?
?? ?
?? ?新建表
?? ?create table stu_info(id int ,name char ,age int ,phone char ,email char,qq char);
?? ?
?? ?增加記錄
?? ?insert into stu_info values (2,'關二哥',55,'13011112222','gauanerge@163.com','8888888');
?? ?
?? ?查詢記錄
?? ?select * from stu_info;
?? ?
?? ?修改記錄
?? ?
?? ?
?? ?update stu_info set age = 56
?? ?where id = 2;
?? ?
?? ?刪除
?? ?delete from stu_info where id = 2;
?? ?
?? ?
?? ?select*from 表明 ?where
?? ?從句where?
?? ?
?? ?
?? ?(id int,name char,age int,kind int,salary real);
?? ?
?? ?
?? ?insert into person values(9,'周瑜',39,3,3638.20);
ldd查看使用了哪些庫?
,該代碼段使用SQLite3庫來查詢并打印user
表中的數據、
#include <stdio.h> // 引入標準輸入輸出庫
#include <stdlib.h> // 引入標準庫(雖然在這段代碼中未直接使用,但通常是C程序的標準包含之一)
#include <sqlite3.h> // 引入SQLite3庫的頭文件 // 定義一個回調函數,用于處理sqlite3_exec查詢結果的每一行
// 參數arg是傳遞給sqlite3_exec的第四個參數(這里未使用,設為NULL)
// col是結果集中的列數
// result是一個指向字符串數組的指針,每個字符串都是結果集中的一列
// title是一個指向列名數組的指針(注意:在某些版本的SQLite中,title可能不是所有情況下都可用)
int show(void* arg, int col, char** result, char** title) { int i = 0; static int flag = 0; // 靜態變量,用于控制列標題只打印一次 if (0 == flag) { // 打印列標題(如果存在的話) // 注意:title在某些版本的SQLite或某些配置下可能不是有效的,具體取決于編譯的SQLite版本和設置 for (i = 0; i < col; i++) { if (title && title[i]) { // 檢查title是否為NULL以及當前列名是否為NULL printf("%s\t", title[i]); } else { // 如果title不可用,可以選擇不打印標題或使用占位符 printf("Column%d\t", i + 1); } } printf("\n"); flag = 1; // 設置標志位,避免重復打印標題 } // 打印結果集的每一行數據 for (i = 0; i < col; i++) { printf("%s\t", result[i] ? result[i] : "NULL"); // 如果結果為NULL,則打印"NULL" } printf("\n"); return 0; // 回調函數返回0表示成功
} int main(int argc, char *argv[]) { sqlite3* db; // 聲明一個指向sqlite3結構體的指針,用于存儲數據庫連接 int ret = sqlite3_open("aaa.db", &db); // 嘗試打開數據庫文件aaa.db if (SQLITE_OK != ret) { // 如果打開失敗 fprintf(stderr, "open db error:%s\n", sqlite3_errmsg(db)); // 打印錯誤信息 sqlite3_close(db); // 關閉數據庫連接(盡管在錯誤情況下這可能不是必須的,但是一個好習慣) return 1; // 返回錯誤代碼1表示程序異常退出 } char sql_cmd[256] = "select * from user;"; // 準備SQL查詢命令 char *errmsg; // 聲明一個用于接收SQL執行后可能產生的錯誤信息的指針 ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg); // 執行SQL查詢,并注冊回調函數show來處理結果 if (SQLITE_OK != ret) { // 如果執行失敗 fprintf(stderr, "exec sqlcmd error:%s\n", errmsg); // 打印錯誤信息 sqlite3_free(errmsg); // 釋放sqlite3_exec分配的錯誤信息內存 sqlite3_close(db); // 關閉數據庫連接 return 1; // 返回錯誤代碼1表示程序異常退出 } sqlite3_close(db); // 正常情況下也關閉數據庫連接 return 0; // 程序正常退出
}
在C語言中使用SQLite3庫來查詢數據庫并打印結果
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> // 回調函數,用于處理查詢結果的每一行
int show(void* arg, int col, char** result, char** title) { int i = 0; static int flag = 0; // 靜態變量,用于控制列標題只打印一次 if (0 == flag) { // 如果flag為0,則打印列標題 for (i = 0; i < col; i++) { // 注意:title可能為NULL或包含空字符串,這里直接打印 printf("%s\t", title ? title[i] : "Column?"); } printf("\n"); flag = 1; // 設置flag為1,避免再次打印列標題 } // 打印當前行的數據 for (i = 0; i < col; i++) { // 注意:result[i]也可能為NULL,這里直接打印(如果為NULL,則打印空字符串) printf("%s\t", result[i] ? result[i] : ""); } printf("\n"); return 0; // 回調函數返回0表示成功
} int main(int argc, char *argv[]) { sqlite3* db; // 指向SQLite數據庫連接的指針 int ret = sqlite3_open("aaa.db", &db); // 嘗試打開數據庫 if (SQLITE_OK != ret) { // 如果打開失敗 // 打印錯誤信息并關閉數據庫(盡管在錯誤情況下關閉可能不是必需的,但這是一個好習慣) fprintf(stderr, "open db error:%s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; // 返回錯誤代碼 } char sql_cmd[256] = "select * from user;"; // 準備SQL查詢語句 char *errmsg; // 用于接收可能的錯誤信息的指針 ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg); // 執行SQL查詢并注冊回調函數 if (SQLITE_OK != ret) { // 如果執行失敗 // 打印錯誤信息,釋放錯誤信息占用的內存,并關閉數據庫 fprintf(stderr, "exec sqlcmd error:%s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; // 返回錯誤代碼 } // 查詢成功完成,關閉數據庫連接 sqlite3_close(db); return 0; // 程序正常退出
}