数据库基本概念
Ø数据(Data)
能够输入计算机并能被计算机程序识别和处理的信息集合
Ø数据库 (Database)
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
常用的数据库
Ø大型数据库
•Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
·•IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。
Ø中型数据库
·•Server是微软开发的数据库产品,主要支持windows平台。
Ø小型数据库
··•mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
基于嵌入式的数据库
ØSQLite关系型数据库,体积小,支持ACID事务
Ø基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB
ØFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
ØSQLite关系型数据库,体积小,支持ACID事务
ØBerkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中
ØeXtremeDB是内存数据库,运行效率高
SQLite****基础
ØSQLite的源代码是C****,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
ØSQLite****有以下特性:
•零配置一无需安装和管理配置;
•储存在单一磁盘文件中的一个完整的数据库;
•数据库文件可以在不同字节顺序的机器间自由共享;
•支持数据库大小至2TB;
•足够小,全部源码大致3万行c代码,250KB;
•比目前流行的大多数数据库对数据的操作要快;
1、sqlite的源码是C语言,而且开源
https://www.sqlite.org/index.html
2、安装方式
1。sudo dpkg *.deb
2.在线安装
sudo apt-get update
sudo apt-get install sqlite3 安装数据库软件
sudo apt-get install libsqlite3-dev 安装数据库开发支持的库
sudo apt-get install sqlite3-doc数据库说明文档
老版本在/usr/share/doc/sqlite3-doc新版本在sqlite3
sqlite基础
1 一般情况不区分大小写
2 注释 –
3 存储类型
NULL
INTEGER
REAL
TEXT
BLOB
任何列仍然开源存储任何类型,当数据存入时候,这个字段的数据会转换存储进去
创建数据库
sqlite3 stu.db有就打开没有就创建
系统命令
特点:以点."开头,又叫点命令
.help 帮助信息,获取点命令清单
.exit .quit退出
.table 查看当前数据库表格
.schema 查看表的结构
.schema 表名
.databases 显示当前打开了那些数据库文件
创建一个表
每条sqlite语句都是以;结尾,如果没有遇到分号,就认为这条语句没有结束。
create table 表名(字段 数据类型,字段 数据类型,字段 数据类型,······);
数据类型不严格检查
create table stu(id int,name char,age int ,score float);
删除一个表
drop table 表名;
DROP table cesh1;
插入数据
方式1
INSERT INTO 表名 VALUES(数据,"数据",数据,数据);
INSERT INTO stu VALUES(007,"zhangsan",18,99);
插入字符串时候需要加引号,双引号和单引号都可以
方式2 插入部分字段数据
INSERT INTO stu (id,name,score) VALUES (004,"lisi",77);
查看记录
全部查看
SELECT * FROM 表名 ;
SELECT * FROM stu ;
按照某个条件查看
SELECT * FROM stu WHERE score=99;
sqlite> SELECT * FROM stu WHERE score=88 and name="zhangsan";
sqlite> SELECT * FROM stu WHERE score=456 or name="qwx";
查询指定字段
sqlite> SELECT name,score FROM stu;
让显示结果好看些
sqlite> .header on
sqlite> .mode column
sqlite> .timer on
更新一条数据(修改)
sqlite> UPDATE 表名 SET 字段=新值 WHERE 字段=匹配;
sqlite> UPDATE stu SET age=20 where name="zhangsan";
sqlite>UPDATE stu SET name="wangermz",age=33 WHERE id=6;
删除一条数据
sqlite> DELETE FROM 表名 where 字段=配置的值;
sqlite> DELETE FROM stu where id=14;
sqlite> DELETE FROM cesh1 ;删除表中所有数据
增加一列
sqlite> ALTER TABLE 表名 ADD COLUMN 新的字段 字段类型;
sqlite> ALTER TABLE stu ADD COLUMN sex char;
删除一列
不支持直接删除一列
想复制一份要保留的列的表,然后删除老表
把新表重命名成老表
sqlite> CREATE TABLE stu1 AS SELECT id,name,score FROM stu ;
sqlite> DROP TABLE stu;
sqlite> ALTER TABLE stu1 RENAME TO stu;
设置主键
CREATE TABLE ceshi2(id int primary key,name char,sex char);
primary key设置为主键的列,数值是唯一的
主键不能为NULL空
sqlite编程接口
1)打开数据库(存在就打开,不存在就创建)
#include <sqlite3.h>
int sqlite3_open(
const char *path, /* Database filename (UTF-8) */
sqlite3 **db /* OUT: SQLite db handle */
);
参数:
path:数据库文件的路径+文件名
db :句柄,指向sqlite句柄的指针
打开数据库后开源通过db操作数据库
这是二级指针,大家在外面定义要给一级指针取地址传进去
返回值:
成功返回0,SQLITE_OK
失败返回错误码(非零值)
2)得到错误信息
const char *sqlite3_errmsg(sqlite3*db);
db就是sqlite3_open第二个参数数据库句柄
fprintf(stderr,"错误 %s\n",sqlite3_errmsg(db));
3)关闭数据库
int sqlite3_close(sqlite3* db);
db就是sqlite3_open第二个参数数据库句柄
返回值:
成功返回0,SQLITE_OK
失败返回错误码(非零值)
4)编译
gcc 编译时候需要加-lsqlite3
5)数据库操作
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 */
);
参数:
db句柄
sql:数据库操作语句,上午学习的语句
callback:回调函数,是一个函数指针,只有查询时候才用
arg:是传递给回调函数的参数
errmsg:错误消息,需要定义一个char * errmsg
可以直接打印 printf("%s",errmsg);
返回值:
成功返回0,SQLITE_OK
失败返回错误码(非零值)
5 回调函数
int callback(void*para,int f_num,char**f_value,char**f_name)
功能:每找到一条记录自动执行一次回调函数
参数:
para:传递给回调函数的参数
f_num:表的列数(记录宏包含字段数目)
f_value:查询的结果指针数组
f_name:表头名指针数组
返回值:
成功0
失败-1
int callback(void * para ,int f_num,char **f_value,char **f_name){
printf("para:%s\n",(char*)para);
int i=0,j=0;
//打印表头
for(j=0;j<f_num;j++)
printf("%-15s",f_name[j]);
puts("");
//打印搜索结果
for(i=0;i<f_num;i++){
if(!strncasecmp(para,f_value[2],3))
printf("%-15s",f_value[i]);
}
puts("");
return 0;
}
不使用回调函数
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
char ***resultp, /* 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 */
);
参数
db句柄
sql:数据库操作语句
resultp:用来指向sql语句执行的结果
pnRow:满足条件的行数
pnColumn:满足条件的列数
pzErrmsg:错误信息地址
void sqlite3_free_table(char **result);
返回值:
成功返回0,SQLITE_OK
失败返回错误码(非零值)