数据库初级入门sqlite3版本
0.數據庫大綱
數據庫是什么 ?
如何在在命令行使用SQL語句操作數據庫 ?
如何在C/C++程序中操作數據庫
1.數據庫和數據庫管理系統及數據庫系統
數據庫是一個存儲數據(電子化表格)的倉庫.
數據庫, 簡單來說可以看做是一個電子化的文件柜,—> 存儲電子文件的工具,
用戶可文件中的數據進行 , 增 , 刪 , 改 , 查等操作.
其實我們常說的"數據庫" 值的是 “數據管理系統”.
數據庫(DataBase) :存儲數據(電子化表格)的倉庫.
數據庫管理系統(DBMS DataBase Management System) : 數據庫對外操作數據的接口.
數據庫系統(DBS DataBase System) : 帶有數據庫的計算機系統, 一般由數據庫,數據庫管理系統
(及其開發工具),相關的硬件,軟件和各類人員組成.
數據庫系統 包含 數據庫 和 數據庫管理系統.
數據庫管理系統(DBMS)是為數據庫設計的計算機軟件,一般都是可以對數據進行, 增 , 刪 , 改 , 查等操作.
我們數據庫(DB) 和 數據庫管理系統(DBMS) 之間的關系和現實中 :
? excel中學生表(多個表) 和 excel關系.
1.關系型數據庫(Relational Database)
關系型數據庫是創建在關系模型(E-R模型)基礎上的數據庫(數據和數據是存在關系的)關系 ? 表格
表 是行和列的形式組織起來的數據的集合;
關系型數據庫是由多個表組成的數據庫.
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yACgTkaP-1667307229748)(…/3-pic/image-20221101093019425.png)]
行 : 一條完整的記錄 , 包含多個不同的屬性.
列 : 具有相同屬性的數據集合 .
表中的每一行稱為一條記錄 , 一列稱為一個字段(屬性), 每一列的標題稱為字段名.
如果給關系型數據庫中的每一個關系取一個名字 , 則一個有n個字段的關系表可以表示為 :
? 關系表名(字段1 , 字段2 , 字段3 , … , 字段n);
? 如 : 學生信息表(學號 , 姓名 , 地址 , 班級)
常用的關系型數據庫(數據庫管理系統有很多)
? Oracle
? Mysql
? Sqlite3 輕量級的開源的關系型數據庫 , 很適合在嵌入式設備上使用
? SQL server
? DB2
關系型表格如何創建 ?
E-R模型(可以描述現實生活中的關系模型)
實體-關系模型
實體-關系模型圖 ,由三個部分組成 :
? 實體 : 客觀存在的事物, 用矩形表示 , 如 : 學生 ,成績
? 聯系 : 實體之間的聯系, 用菱形表示 , 如 : 考試
? 屬性 : 實體所具有的某一個屬性 ,用橢圓表示 ,如 : 學號, 姓名
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ij9jBgZd-1667307229751)(…/3-pic/image-20221101095015125.png)]
一般來說 ,一個實體就會對應一個表格 ,實體的屬性就是對應表格中的字段 ,多個表格可以通過 主鍵 和 外鍵相互聯系
-
主鍵
關系型數據庫中一條記錄中有若干個屬性 ,若一個屬性能唯一的標識一條記錄.
該屬性就可以設置成一個主鍵.
如 :
? 學生信息表(學號 ,姓名 ,地址 ,班級)
? 其中每一個學生的學號是唯一的, 學號就是學生表中的一個主鍵.
? 課程表(課程編號 ,任課老師 ,開課時間)
? 其中的課程編號是唯一的,課程編號就是課程表中的一個主鍵
成績表中單一的一個屬性無法唯一標識一條記錄 , 學號 和 科目的組合可以
唯一標識一條記錄 , 主鍵可以是屬性的集合.
-
外鍵
在當前表中不是主鍵 ,但是在其他表中是主鍵.
成績表中的學號不是成績表的主鍵 ,但是他和學號表中的學號是對應的,
并且學生表中的學號是學生表的主鍵 ,則把成績表中的學號叫做學生表的外鍵.
主鍵 和 外鍵主要是維護關系數據的完整性.
? a . 主鍵能在當前表中唯一標識一條一條記錄.
? b.外鍵是用于和另外一張表的關聯.
2.關系型數據庫語言 SQL語言
SQL (Structtured Query Language)結構化的查詢語言 ;
是一種通用的功能強大的關系型數據庫語言 .
結構化的查詢語言包含六個部分 :
數據查詢語言 DQL Data Quary Language
從數據庫中獲取/查詢數據(SELECT)
用來操作數據庫中的用戶數據 ,包括增加數據(INSERT) ,刪除數據(DELETE) ,
修改數據(UPDATE)
確保DML語句的作業及時的更新到數據庫中;
數據控制語言 DCL
數據定義語言 DDL Data Define Language
用來操作數據庫中的元數據
包括創建一個表 ,刪除一個表 , 修改一個表中的字段.
數據查詢語言 DQL Data Quary Language
? 從數據庫中獲取/查詢數據(SELECT)
數據庫的操作語言 DML Data Manipulation Language
? 用來操作數據庫中的用戶數據 ,包括增加數據(INSERT) ,刪除數據(DELETE) ,
? 修改數據(UPDATE)
數據定義語言 DDL Data Define Language
? 用來操作數據庫中的元數據
? 包括創建一個表 ,刪除一個表 , 修改一個表中的字段.
所有的SQL語句都是在命令行中執行的 執行sqlite3命令就要進入sqlite3命令行 sqlite3 .help .quit .exit 退出sqlite3的程序(1) 創建一個sqlite數據庫(里面沒有數據)對象
終端 :
sqlite3 數據庫對象名字 //打開或創建一個數據庫如 : sqlite3 test.db通過SQL語句操作數據庫都是在sqlite3的命令行程序中 :
注意 :
a.在sqlite3命令下面 ,SQL語句以分號(" ; ")結束
b.SQL語句支持大小寫 ,但是在實際使用中建議使用大寫 ;
? 因為所有的語句在執行的時候 ,都是先轉換為大寫的形式.
(2) 在數據庫對象(test.db)中創建一個表
CREATE TABLE : 用來創建一個關系表
語法 :
CREATE TABLE 表名(列名1 數據類型 "約束",列名2 數據類型 "約束",列名3 數據類型 "約束",...列名n 數據類型 "約束" );表名 : 數據庫中關系表的名字 列名 : 關系表中的字段名 數據類型 : 說明字段中的數據的類型integer(size) 此字段必須為整數 size規定數字的最大的位數int(size)smallint(size)...decimal(size,d)容納帶小數的數字,size規定數字的最大位數,d表示小數點右側的最大位數floatdoublerealchar(size) 固定從長度的字符串 ,size規定字符串的長度varchar(size) 可變長度的字符串,size規定字符串的最大長度textdata 日期2022/11/12022-11-1約束 :NOT NULL 此字段不能為空UNIQUE 此字段唯一(不能重復)PRIMARY KEY 主鍵 ,主鍵必須是 NOT NULL AND UNIQUEFOREGIN KEY 外鍵 ,這一列在其他表中是主鍵,在自己的表中不是主鍵CHECK 用于限制數據的范圍CHECK SCORE>=0 AND SCORE<=100例子 : 在test.db中創建一個學生表
? STUINFO(學號 ,名字 ,地址 ,分數)
CREATE TABLE STUINFO(NUM int(4) PRIMARY KEY,NAME varchar(255) NOT NULL,ADDR varchar(255) NOT NULL,SCORE real(4) CHECK(SCORE>=0 AND SCORE<=100) ); CREATE TABLE STUINFO(NUM int(4) PRIMARY KEY,NAME varchar(255) NOT NULL,ADDR varchar(255) NOT NULL,SCORE real(4) CHECK(SCORE>=0 AND SCORE<=100));CREATE TABLE STU(NUM int(4) PRIMARY KEY,NAME varchar(255) NOT NULL,ADDR varchar(255) NOT NULL,SCORE real(4) CHECK(SCORE>=0 AND SCORE<=100));查詢數據庫中的表格
.table查看表格的結構
.schema刪除數據庫中的一個表
語法 :
DROP TABLE 表名;如 : DROP TABLE STUTEST;修改表的結構 :
a . 修改表名
ALTER TABLE 表名 RENAME TO 新名字;如 : ALTER TABLE STU RENAME TO STUINFO;b . 增加字段
ALTER TABLE 表名 ADD 字段名 字段類型;如 : ALTER TABLE STUINFO ADD TEL INT;//在STUINFO中增加一個新的字段(3) 向表中插入新行(一條新的記錄)
INSERT INFO : 用于向表格插入新行
語法 :
INSERT INFO 表名 VALUES(值1,值2,...,值n); INSERT INFO 表名(字段1,字段2,...) VALUES(值1,值2,...,值n);如 : INSERT INTO STUINFO VALUES(1,"zhangsan","cs",88,10086);INSERT INTO STUINFO(NUM,NAME,ADDR,SCORE) VALUES(2,"lisi","cs",89);(4) SELECT用于從表中選取數據 ,把結果列舉出來
語法 :
SELECT 列名1,列名2... FROM 表名 WHERE 列 運算符 值; SELECT * FROM 表名;//查看表中所有的信息如 : SELECT * FROM STUINFO;INSERT INTO STUINFO VALUES(3,"wangwu","bj",68,10000); INSERT INTO STUINFO VALUES(4,"zhaoliu","jx",99,119);運算符 :
= 等于 <> 不等于 > 大于 < 小于 BETWEEN ANDSELECT * FROM STUINFO WHERE NUM=1;//查看學號為1的學生信息SELECT * FROM STUINFO WHERE NUM<>1;//查看學號不為1的學生信息SELECT * FROM STUINFO WHERE NUM>3;//查看學號大于3的學生信息//查看學生表中學號為2-4之間的學生信息SELECT * FROM STUINFO WHERE NUM BETWEEN 2 AND 4; WHERE 表示條件查詢如果有多個條件 :AND 并且OR 或者//查看學號為2或者電話為10086的學生信息SELECT * FROM STUINFO WHERE NUM=2 OR TEL=10086;限定 + 排序SELECT * FROM 表名 ORDER BY 字段 ASC/DESC//查看學生表中根據分數降序排序的前三條記錄SELECT * FROM STUINFO ORDER BY SCORE DESC LIMIT 3;查找模糊值(like)//查找姓zhang的學生信息SELECT NAME,NUM,TEL FROM STUINFO WHERE NAME LIKE 'zhang%';SELECT NAME,NUM,TEL FROM STUINFO WHERE NAME LIKE '%i%';(5) 多表查詢–多表連接
CREATE TABLE KCB(NUM INT,KCH INT PRIMARY KEY,NAME VARCHAR,SCORE REAL); INSERT INTO KCB VALUES(1,1,"yuwen",89); INSERT INTO KCB VALUES(1,2,"shuxue",68); INSERT INTO KCB VALUES(1,3,"yingyu",70);語法 :
SELECT 表名.列名1,表名.列名2... FROM 表名1,表名2 WHERE 列 運算符 值;如果在多表查詢中不指定連接條件,就會自動的連接,導致將一個表中所有的行都連接到另一個表中所有的行上面 --- 卡迪爾積 如果第一個表中有50行,第二個表中有10行,得到的結果就有500 多表查詢的時候,實際上是從產生的"卡迪爾積"的結果中得到滿足條件的記錄. SELECT STUINFO.NUM,STUINFO.NAME,STUINFO.ADDR,KCB.NUM,KCB.KCH,KCB.SCORE FROM STUINFO,KCB;SELECT STUINFO.NUM,STUINFO.NAME,STUINFO.ADDR,KCB.NUM,KCB.KCH,KCB.SCORE FROM STUINFO,KCB WHERE STUINFO.NUM=KCB.NUM; .header on //列舉結果的時候,會顯示表頭 .mode colum //按照列的方式顯示結果這樣看起來會順眼一些SQL語句 ,需要掌握的有 :
創建一個表 CREATE TABLE 刪除一個表 DROP TABLE 修改一個表的元數據 ALTTER TABLE 查詢數據 SELECT 增加表中的用戶數據 INSERT INTO 刪除表中的用戶數據 DELETE FROM 修改表中的用戶數據 UPDATE4.數據庫對C/C++的API接口
通過C/C++程序去操作數據庫
如何通過API函數接口 ,執行SQL語句
Sqlite3的API函數接口的核心部分 :
? 兩大對象 和 八大函數
-
兩大對象
數據庫連接對象(The Database Connection Object)
數據庫連接句柄/數據庫自己的文件描述符 ,表示一個已經打開的數據庫
sqlite3 * 代表你打開的那一個sqlite3的數據庫文件(test.db);
后續對數據庫的所有操作都需要通過這個連接對象.
SQL語句對象(The prepare Statement Object)
sqlite3_stmt
就是一條準備好的SQL語句.
操作數據庫的標準語言就是SQL語句 ,在這里 ,使用準備好的SQL語句對象
表示的SQL語句去操作數據連接對象表示的數據庫.
-
利用SQL語句操作數據庫的流程(八大函數)
1.建立連接
2.打開/創建一個數據
sqlite3_open();//打開或創建一個sqlite3的數據庫連接對象3.利用SQL語句對象操作數據庫
sqlite3_prepare_v2();//準備一個SQL語句對象 sqlite3_bind_*();//綁定參數 sqlite3_step();//執行sql語句 sqlite3_column();//輸出查詢到的數據庫的數據 sqlite3_finalize();//釋放資源,銷毀SQL語句對象sqlite3_exec();4.關閉數據庫
sqlite3_close();//關閉一個數據庫連接對象
5.具體的API函數的使用
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hipXwlnD-1667980048382)(…/3-pic/image-20221102102404172.png)]
(1) 打開數據
sqlite3_open
sqlite3 * 代表你打開的那一個sqlite3的數據庫文件(test.db) ,
后續對數據的所有操作都需要通過這個連接對象.
SQLITE_API int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );filename : 要打開的sqlite3的數據庫名字(帶路徑)ppDb : 二級指針,用來保存打開的數據庫的連接對象(連接句柄)ppdb指向的內存是用來保存打開的數據庫對象的地址.返回值 :成功 返回SQLITE_OK失敗 返回其他值(2) 關閉一個sqlite3數據庫連接對象
sqlite3_close
SQLITE_API int sqlite3_close(sqlite3*);參數為你要關閉的數據庫指針(3) 關于SQL語句對象的API函數(準備)
sqlite3_stmt 這個結構體來描述一個SQL語句對象
我們的應用程序都是通過SQL語句對象去發送SQL語句的.
sqlite3_stmt * stmt;//SQL語句對象的指針 sqlite3_prepare_v2();//準備一個SQL語句 SQLITE_API int sqlite3_prepare_v2( sqlite3 *db, //數據庫連接對象,語句作用在哪一個數據庫上const char *zSql, //要執行的原始的sql語句的字符串形式 int nByte, //原始sql語句的長度 sqlite3_stmt **ppStmt, //OUT: 用來保存解析后的SQL語句對象 const char **pzTail //OUT: 指向原始的sql語句中未使用的部分 );nByte : 原始sql語句的長度(原始語句可以包含多條SQL語句)<0 :編譯到zSql指向的sql語句的第一個'\0'為止.>0 :編譯到zSql指向的sql語句的nByte指定的字節為止.=0 :什么都不編譯.ppStmt : 二級指針,用來保存解析后的SQL語句對象的地址要改變指針變量的值,指針不在作用范圍內,只能間接訪問,把指針變量的地址傳入函數,在函數的內部就可以改變指針變量的值.在函數內部,可能會讓指針變量指向一個準備好的SQL語句對象.pzTail :二級指針,用來指向原始的SQL語句總未使用的部分(如果不需要,也就是說zSql指向的字符串中只有一條SQL語句,則可以指定為NULL);可以實現一個字符串中寫多條SQL語句,準備一條語句后,指針指向的位置為未使用的部分.sqlite3_stmt * stmt;//SQL語句對象的指針const char *p = NULL;sqlite3_prepare_v2(test.db,str,-1,&stmt,&p);在函數執行完畢后,stmt指向準備好的SQL語句對象p指向str中未使用的部分.返回值 :成功 返回SQLITE_OK失敗 返回其他值(4) 執行一條準備好的SQL語句(SQL語句對象)
sqlite3_step
SQLITE_API int sqlite3_step(sqlite3_stmt*);stmt : 指針,指向你準備好的SQL語句對象,也是你要執行的SQL語句對象返回值 :成功 返回SQLITE_DONE失敗 返回其他值(5) 釋放資源
sqlite3_finalize
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);在prepare的時候,很有可能讓stmt指針指向了動態分配的內存空間,通過函數釋放所有的資源.
-
<1> pzTail :二級指針,用來指向原始的SQL語句總未使用的部分(如果不需要,也就是
說zSql指向的字符串中只有一條SQL語句,則可以指定為NULL); -
<2> 從標準輸入往數據庫中添加數據
-
<3> 讀取文件數據并添加到數據庫中
-
<4> 通過綁定索引值往數據庫中添加數據
(6) 一步查詢的執行操作(sqlite3_exec)
sqlite3_exec()接口[sqlite3_prepare_v2 , sqlite3_step , sqlite3_finalize ]集合,他可以
讓應用程序運行多個SQL語句 ,而不必使用大量的C語言代碼.
SQLITE_API int sqlite3_exec( sqlite3*, //數據庫連接對象 const char *sql, //是一條你要執行的SQL語句 int (*callback)(void*,int,char**,char**), //回調函數,只有在SELECT的時候才有用 void *, //回調函數的第一個參數 char **errmsg //出錯信息的指針 ); int (*callback)(void*,int,char**,char**)函數指針,執行你要執行的函數,函數的返回值為int,有四個參數當調用sqlite3_exec 去執行SELECT語句的時候,就會執行這個回調函數,主要作用是處理SELECT的結果信息. int (*callback)(void*,int,char**,char**)回調函數參數的詳細信息 :第一個參數是指針,可以傳入用戶自己的數據第二個參數是執行SELECT語句后,查詢到結果的列數第三個參數是一個指向字符串的指針數組,就是結果數據的每一列信息第四個參數是一個指向字符串的指針數組,就是結果數據每一列的表頭信息sqlite3_exec參數詳解 :
第一個參數是你要操作的數據連接對象 第二個參數是以分號分隔的SQL的原始語句第三個參數如果為空,表示沒有回到函數,如果不為空,在執行SELECT語句的時候 會調用回調函數,回調函數主要是處理SELECT查詢到的結果第三四個參數作為回調函數的第個參數(作用用戶自定義)第五個參數不為NULL,則將錯誤信息寫入[sqlite3_nalloc]分配內存中, 并且讓第五個參數指向的分配的內存,為了避免內存泄漏,應用程序在處理完 錯誤信息后,通過sqlite3_free釋放第五個參數指向的內存.只有在執行SELECT語句的時候,才需要回調函數
SELECT有多少條記錄,就會執行多少次回調函數
總結
以上是生活随笔為你收集整理的数据库初级入门sqlite3版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易2018校园招聘编程题真题集合2相反
- 下一篇: PostgreSQL 杀会话