关于linux数据库编程——sqlite3
C 数组
链表 内存 程序已结束 数据消失
---------------------------------
文件 硬盘 永久存储设备
数据库 :数据的仓库
一电子化的文件柜 :
数据库是“按照数据结构来组织、存储和管理数据的仓库”。
是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
二、关系型数据库:
关系模型数据的逻辑结构是一张二维表
*每一行是一个一个对象成员
*每一列是对象的一个属性
特点:
1、每一列中的分量是类型相同的数据。
2、列的顺序可以是任意的。
3、行的顺序可以是任意的。
4、表中的分量是不可再分割的最小数据项,即: 表中不允许有子表。关系数据库采用关系模型作为数据的组织方式
关系数据库因其严格的数学理论、使用简单灵活、数据独立性强等特点,而被公认为最有前途的一种数据库管理系统。它目前已成为占据主导地位的数据库管理系统自 20 世纪 80 年代以来,作为商品推出的数据库管理系统几乎都是关系型的,例如:Oracle、Sybase 等。
三、常用数据库:
常用的数据库
常用的数据库有:
ORACLE、Mysql、SQL server、Access、 Sybase、SQLite
1、ORACLE: //大型
ORACLE 是甲骨文公司开发的一款数据库,
是一种适用于大型、中型和微型计算机的关系数据库管理系统,
它使用 SQL 语言作为它的数据库语言。2、MySQL: //中小型
MySQL 是一个开放源码的小型关系型数据库管理系统,
开发者为瑞典 MySQL AB 公司,92HeZu 网免费赠送 MySQL。
目前 MySQL 被广泛地应用在 Internet 上的中小型网站.
提供由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,
许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。3、SQL server: //微软的中型
真正的客户机/服务器体系结构。 微软 Microsoft 出品的一款数据库软件图形化用户界面,使系统管理和数据库管理更加直观/简单
具有很好的伸缩性,可跨越从运行 Windows 95/98 型电脑到运行 Windows 2000 的大型多处理器等多种平台使用。4、Access:
Access 是由微软发布的关系数据库管理系统。
它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一
Access 是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的, 效率也很高. 但是它的同时访问客户端不能多于 4 个。
access 数据库有一定的极限,如果数据达到 100M 左右,很容易造成服务器 iis 假死,或者消耗掉服务器的内存导致服务器崩溃。5、Sybase:
sybase 公司 1987 年推出了 Sybase 数据库产品
Sybase 主要有三种版本,
一是 UNIX 操作系统下运行的版本,
二是 Novell Netware 环境下运行的版本,
三是 Windows NT 环境下运行的版本。Windows NT:
Microsoft Windows NT(New Technology)是 Microsoft 在 1993 年推出的面向工作站、网络服务器和大型计算机的网络操作系统,也可做 PC 操作系统
Sybase 数据库特点:
1:基于客户/服务器体系结构的数据库。
2:它是真正开放的数据库 ,容易移植。
3:它是一种高性能的数据库。
四、sqlite3数据库介绍:
//学生的信息
struct stu
{
int sno;
char name[20];
int age;
};110 xiaoMing 20
database
DBMS: data base management system (数据库管理系统)甲骨文 -- oracle 认证
数据库
sun / java
solaris gnu
1、分类: 大型 中型 小型
ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库 : 数据存储典型的就是 表 //sqlite3
非关系型数据库: 类似json数据 键值对 //芒果db
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
1sqlite的介绍
A.sqlite的源代码是C,其源代码完全开放。sqlite第一个Alpha版本诞生于2000年5月。
他是一个轻量级的嵌入式数据库。
B.sqlite有一下特性<1>零配置,无需安装和配置
<2>储存在单一磁盘文件中的一个完整的数据库
<3>数据库文件可以在不同字节顺序的机器间自由共享
<4>支持数据库大小之2TB
<5>足够小,全部源代码大致3万行C代码,250KB
<6>比目前流行的大多数数据库对数据的操作要快
2学习参考:
http://www.runoob.com/sqlite/sqlite-update.html
3安装:
whereis sqlite3
//安装 sqlite3
4、sqlite3的安装: LTS long term support
1、在线安装 :
//ubuntu能上网
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
gcc test.c -lsqlite3 -lpthread
2、验证是否安装成功:
sqlite3 --version
sqlite3 --help3.源码安装:
a. ./configure ---配置 编译 规则(makefile)
b. make //编译出 安装程序
c. make install
4[简单使用:]
1.数据库
sqlite3 小型嵌入式数据2.操作:[1] $sqlite3 <数据库文件名>//如果数据库文件不存在,则创建//存在则直接打开[2].获得帮助信息sqlite3> .help //注: sqlite3 命令都是以 “.”开头sqlite3常用命令://进入到sqlite3软件中之后,.help ---查看 sqlite3的支持的相关命令 .quit ---退出sqlite3 软件 .databases --- 查看当前关联的数据库文件 是哪个?
2增删改查
sqlite3 --- 关系型数据库
表格的结构
姓名 性别 年龄 电话
xxx x xxx xxx xxx //一条记录
非关系型数据库:
key=value; //键值对
name="xiaoMing" //json的数据
3SQL语言 (Structure Qurey Language)
//结构化查询语言 -- 用在数据库的操作
增删改查
增:创建表sqlite3>create table <表名> (字段1 数据类型,字段2,.....); eg: create table stu (sno,sname ,age);create table user (name,sex,age,tel);命令: sqlite3> .tables //查看数据库中表有哪些sqlite3> .schema //查看表的结构sqlite3:相关命令.tables //查看已经创建的表 .schema //查看表的结构 --create语句 //插入数据 sql: //sql语句(structure qurey language) 需要以分号作为结束表示insert into <表名> values (110,'XiaoMing',18); //查询信息 sql:select 列名 from 表名;select * from stu;命令:sqlite3> .headers on //开启表头的显示sqlite3> .mode column //开启列模式(左对齐的方式显示)//按条件查询sql:select * from where <条件>;eg://查看学生表中,年龄大于18岁人的信息select * from where age > 18;//查看学生表中,年龄大于18岁小于25岁的人的信息select * from where age > 18 and age < 25;SELECT column1, column2, columnN FROM table_name WHERE [condition]SELECT * FROM table_name WHERE [condition] //数值数据 //字符串形式 //删除命令sql:delete from <表名> where <条件>; eg://删除学生表中的年龄等于18岁的人的信息delete from stu where age = 18;
4exe:
创建学生信息表,
添加信息
查询信息
删除信息
熟悉相关sqlite3 操作命令
.help
.quit
.headers on
.mode column
.tables
.schema
.databases
sql:
create
insert
select
增加:
创建表 --create table
添加信息 --insert into
删除:
删除一条信息--delete from
drop
修改:
修改字段信息 update
添加字段 alter
查询:
select
5、sqlite3的使用:
0、启动sqlite3
sqlite3 xxx.db ===>用sqlite3 来打开一个名称为test.db的本地数据库。出现如下提示符:表明数据库管理系统启动。sqlite> 退出数据库: .q 命令注意:如果一直出现如下符号:...> 则写';'结束。以下所有命令必须在 sqlite> 后执行。创建一个数据库:1、touch xxx.db2、sqlite3 xxx.db
1、系统维护命令:===> .help
出现所有相关的系统维护命令,都是以 "."开头。.database 列出当前库和系统中那个文件在关联.tables 列出当期数据库中的所有表.schema xxx 列出当前指定的xxx表结构.dump user ===>导出数据库重定向sqlite3 test.db .dump > 123.sqlsqlite3 xxx.db < test.sql ===>导入数据库
2、标准SQL语句:===》通用语法在其他平台可以直接使用。struct query language;
注意:所有的sql语句都以';'结尾。
//创建一个表:ddl//sql语法: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);//删除一个表://sql语法:drop table 表名;eg:drop table user;数据库常规操作: 增加 删除 修改 查询//插入数据时,某些字段,不给值 NULL --- sql 语句--- 空 c语言中区分 --- NULL(空指针) //define NULL (void *)0 //向表中增加数据://sql语法: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);//插入数据写法://全部插入 insert into 表名 values(所有字段对应值); //如果某些字段,不想给值,可以写成NULL(空值)//部分插入 insert into 表名(指定字段) values(指定字段对应值);//查询表中的数据://sql语法:select 列名 from 表名 条件;eg://方式1: 查询所有信息 select * from user ; //打印表中所有信息 //方式2: 查询指定字段的信息select id from user;select id,name from user where not age <30//方式3: 查询指定条件的信息 //where条件 (子句)where name like '三一' % _ascselect *from user where age>20 or age<50 order by age desc limit 2 ;//&& || c语言的写法 例子:登录一个网站的时候 用户名 密码select * from user where name=用户名 and passwd=密码; 用户名:tom
密 码:123456
用户名 和 密码 查询了一下
select * from user where name=用户名 and passwd=密码;
练习:
用学生这个表,进行条件查询!
//修改表中数据:
//更新
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;
>2018-1-1 and <2018-12-31
增 ---creat / insert
删 ---drop / delete
改 ---alter / update
查 ---.table(.schema)/select
练习:
新建一个mydb.db数据库,并在库中新建一个student表
至少不能少3个字段,依次录入5条记录删除其中第一条和
倒数第二条记录
6、补充:
6.1插入时间列
unicodeCREATE TABLE user1(id int,name char,age int,dt datetime);
eg:insert into user1 values (2,'张三',23,datetime('now','+8 hours')); //utc
6.自动增长列
create table user5 (id INTEGER PRIMARY KEY ASC,name char, age int);
//int 需要写成 INTEGER 才能实现自动增长
create table user4 (id int PRIMARY KEY ASC,name char, age int);
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime);sqlite> insert into user3 (NULL,'李四',23,datetime('now'));
6.3主键: 编号作为主键
asc -- 升序
desc -- 降序
where (group by having) order by [desc] limit;select * from user where id<10 order by id limit 2;
6.4其他
[维护命令]:
1、数据的导出:
sqlite3 xxx.db .dump > xxx.sql
//将数据库名称为xxx的数据库整体导出到脚本中。2、数据的导入:
sqlite3 xxx.db < xxx.sql3、可视化工具安装:
sudo apt-get install sqliteman
NavicatSqlite3 --- windows下 //图形化的操作工具
7编程层面 进行操作?
APIs (application program interface) --- 编程接口 --函数
==================================================
sqlite3 数据库编程接口:
1、需要的头文件
sqlite3.h
2、编译过程
-lsqlite3
3、编程框架:
打开数据库 ==》读写数据库(增,删,改,查) ==》关闭数据库
sqlite3.h
类比:
FILE *fp = fopen------->hello.c
编程:
fp 代表就是hello.c
sqlite3 ** db qlite3_open ------------>user.db
3.1 打开数据库: sqlite3_open
int sqlite3_open(const char *filename, /* in: Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */ //句柄 );sqlite3 * db;int sqlite3_open(char * path,sqlite3 ** db);功能:打开指定path路径+文件名称的数据库,并将打开的地址指向db变量的句柄。参数:path 要打开的数据库路径+名称db 要打开的数据库地址指针返回值:成功 0失败 -1;sqlite3* * db //某个指针变量的地址注意:数据库文件 不存在时,此时 sqlite3_open 会创建该数据库文件 如果数据库文件存在,此时,sqlite3_open 默认打开该文件 sudo apt-get install libsqlite3-dev //解决头文件包含出错的问题
3.2 关闭数据库: sqlite3_close
int sqlite3_close(sqlite3 *db);功能:关闭指定的数据库参数:要关闭的数据库地址返回值:成功 0失败 -1;//增 删 改 查
//sql 语句 ---执行sql语句,从而影响到数据文件的内容
3.3 数据库操作:
查询操作:sqlite3_get_table(); ////select int sqlite3_get_table(sqlite3 *db,char *sql,char *** rest, //&p ---> char ** * int *nrow,int *ncol,char ** errmsg);char *a[10] = {};a ---> char ** char **p = a; char *array[] = {"hello","world"};arrary => char **char **p = arrary; sqlite3_get_table(sqlite3 *db,char *sql,&p, //&p ---> char ** * int *nrow,int *ncol,char ** errmsg);功能:在db数据库上执行sql查询语句,并将执行的结果集返回到rest地址上,同时返回查询的行和列。参数:db 要执行查询语句的数据库sql 要执行的select查询语句rest 查询的结果集是一个三级指针//用来保存 结果的字符串 指针数组的首地址 nrow 查询的结果的行数 //保存结果的行数 ncol 查询的结果的列数 //保存结果的列数 errmsg 如果执行有错误,则存储错误。返回值:成功 0失败 非0;执行sql语句:sqlite3_exec(); ////insert delete updatechar *errmsg;int sqlite3_exec(sqlite3 *db,char *sql,callback fun, //回调函数 -- select 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注意:该回调函数必须有返回值,否则可能导致查询异常。char *value[] = {"1","A","14","2","B","15",NULL};char *name [] = {"id","name","age",NULL};[name ]->{"id","name","age",NULL}[info1]->{"1","A","14"}[info2]->{"2","B","15"}[info3]-> NULLsqlite3_errmsg() //出错信息
练习:1创建一个学生表,最少不能低于3个字段
最好有一个唯一主键,
设计程序以代码方式,依次输入5个学生信息
并存储到数据库中,最终查询显示所有学习信息。id(主键,自动),name,age,addr,datetime,recommand;
至少插入5条记录。
修改3处。
删除2条记录。信息系统:
请输入学生信息:
name :
sno :
score:
练习:给数据库表添加主键:
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);
sqlite3 操作的基本思路:
sqlite3_open
sqlite3_errmsg(db)
sqlite3_close(db);
sqlite3_exec
sqlite3_free(*) //sqlite3_malloc
sqlite3_get_table //sqlite3_free_table 配套
sqlite3_exec //在select时 需要回调来打印结果
sqlite3_get_table //在select时,不需要回调
sqlite3_free_table //注意,sqlite3_get_table 如果select有查询结果
//需要,使用sqlite3_free_table 来释放 堆区空间
练习:查字典
book --- 通过查数据库 输出解释
自动增长列 word explain 时间
sqlite3_open
sqlite3_exec / sqlite3_get_table