能够输入计算机并能被计算机程序识别和处理的信息集合数据库 (Database)
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
常用的数据库
1)大型数据库Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。中型数据库Server是微软开发的数据库产品,主要支持windows平台。
2)小型数据库mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
3)基于嵌入式的数据库
基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中 eXtremeDB是内存数据库,运行效率高
sqlite3 xxxxx.db
如果sq.db存在则直接打开sq.db数据库,如果不存在则先创建再打开;
系统命令,需要以 . 开头,不需要以 ; 结尾
.quit 退出数据库
.exit 退出数据库
.help 显示帮助信息,获取所有系统命令;
.table 查看当前数据库下的所有表格;
.schema 查看表的结构
以分号(;)结尾;不区分大小写;
没有char*类型,用char类型代替
记录:是某一行信息
字段:某一列信息
create table 表名 (字段名 数据类型, 字段名 数据类型);
create table if not exists 表名 (字段名 数据类型, 字段名 数据类型);
eg: CREATE TABLE stu (id int, name char, score float);
CREATE TABLE if not exists stu1 (id int, name char, score float);
注意:数据库不支持严格的数据类型检查,数据类型写错了,创建是能够成功的,不会有错误提示;
drop table 表名;
eg: drop table stu1;
字符串类型可以使用单引号,也可以使用双引号
1) 全字段插入 insert into 表名 values (数据1, 数据2, 数据3);
eg: INSERT INTO stu VALUES (2, 'ls', 99);
INSERT INTO stu VALUES (1, "zs", 59);
注意: 1.数据输入的顺序要与创建时候字段的顺序一致;
2) 部分字段插入 insert into 表名 (字段名1, 字段名2) values (数据1, 数据2);
eg: INSERT INTO stu (id, name) values (9, 'ww');
注意: 1.数据的顺序要与指定的字段名1,字段名2对应;
1) 查看所有记录
select * from 表名;
eg:
SELECT * FROM stu;
2) 查看某几行
select * from 表名 where 限制条件;
逻辑与 and 逻辑或 or
eg:
SELECT * FROM stu WHERE id<3 AND score>90;
SELECT * FROM stu WHERE id<2 OR id>3;
3) 查看某几列
select 字段1, 字段2 from 表名;
select 字段1, 字段2 from 表名 where 限制条件;
eg:
SELECT id, name FROM stu;
SELECT id, name FROM stu WHERE score>90;
update 表名 set 字段=数值 where 限制条件;
eg:
UPDATE stu SET score=60 WHERE id=1;
注意:该语句中的where表明去修改指定的记录,如果没有加where,则表明将所有记录的该值都更新
delete from 表名 where 限制条件;
eg:
DELETE FROM stu WHERE id=1;
delete from stu; 删除表格中的所有数据;
primary key 主键;
create table 表名(字段名 数据类型 primary key, 字段名 数据类型 );
primary key主键:唯一标识表格中的每一条记录;
例如:id字段为主键,当表格中有id==1的记录时,不允许再插入id为1的记录了;
eg:
CREATE TABLE stu (id int PRIMARY KEY, name char, score float);
注意:主键的值必须唯一。每一张表格都应该设置一个主键,而且只能设置一个。
从a中拷贝所有数据到b中:
create table b as select * from a;
从a中拷贝指定字段到b中:
create table b as select 字段,字段,字段 from a;
CREATE TABLE stu1 AS SELECT * FROM stu;
CREATE TABLE stu2 AS SELECT id, name, score FROM stu;
alter table 表名 add column 字段名 数据类型;
alter table stu add column score int;
alter table 旧表名 rename to 新表名;
alter table stu rename to stuinfo;
不支持直接修改列名
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;
不支持直接删除列;
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;
头文件: #include
编译时候要加上-lsqlite3
gcc a.c -lsqlite3
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:打开一个数据库,如果数据库不存在,则创建一个数据库
参数1:要打开的数据库的名字,是一个字符串
参数2:数据库操作句柄,是一个二级指针,需要我们传入一级指针的地址,如果打开数据库成功,则数据库指针由该参数返回
返回值:成功返回SQLITE_OK,失败返回一个错误码(非linux的错误码),可以使用sqlite_errmsg来获取错误信息,由sqlite3_errcode返回错误码值
注意:无论打开数据库是否成功,在不使用数据库时都应该使用sqlite3_close将其关闭
int sqlite3_close(sqlite3*);
功能:关闭数据库,断开句柄所拥有的资源
参数:数据库指针
返回值:成功返回SQLITE_OK,失败返回其他错误码
const char *sqlite3_errmsg(sqlite3*);
功能:通过出错的句柄返回错误信息
参数:出错的句柄
返回值:对应的错误信息,是一个字符串
int sqlite3_errcode(sqlite3 *db)
功能:通过错误句柄返回错误码
参数:错误句柄
返回值:错误码
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,失败返回其他错误码
int callback(void* arg,int cols,char** value_text,char** value_name)
功能:对执行sql语句后的每一条记录,执行该函数,函数功能可以由用户自定义
参数1:主调函数传递的参数,就是sqlite3_exec的第四个参数,该参数可以用于主调函数和回调函数之间数据交流
参数2:记录查询结果的列的个数
参数3:查询结果数据的起始地址
参数4:查询结果的表头的起始地址
返回值:成功返回0,失败返回错误码