1. 安装sqlite3

sudo apt-get install sqlite3

sudo apt-get install libsqlite3-dev

2. sqlite常用命令

当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识:
#sqlite3 test.db

查看数据库文件信息命令(注意命令前带字符'.'):
sqlite>.database

查看所有表的创建语句:
sqlite>.schema

查看指定表的创建语句:
sqlite>.schema table_name

以sql语句的形式列出表内容:
sqlite>.dump table_name

设置显示信息的分隔符:
sqlite>.separator symble
Example:设置显示信息以‘:'分隔
sqlite>.separator :

设置显示模式:
sqlite>.mode mode_name
Example:默认为list,设置为column,其他模式可通过.help查看mode相关内容
sqlite>.mode column

输出帮助信息:
sqlite>.help

设置每一列的显示宽度:
sqlite>.width width_value
Example:设置宽度为2
sqlite>.width 2

列出当前显示格式的配置:
sqlite>.show

退出sqlite终端命令:
sqlite>.quit

sqlite>.exit

3. sqlite3常用指令

sql的指令格式:所有sql指令都是以分号(;)结尾,两个减号(--)则表示注释。
如:
sqlite>create studen_table(Stu_no interger PRIMARY KEY, Name text NOT NULL,
Id interger UNIQUE, Age interger CHECK(Age>6), School text DEFAULT 'xx小学);
该语句创建一个记录学生信息的数据表。
3.1 sqlite3存储数据的类型
NULL:标识一个NULL值
INTERGER:整数类型
REAL:浮点数
TEXT:字符串
BLOB:二进制数

3.2
sqlite3存储数据的约束条件
Sqlite常用约束条件如下:
PRIMARY KEY - 主键:
1)主键的值必须唯一,用于标识每一条记录,如学生的学号
2)主键同时也是一个索引,通过主键查找记录速度较快
3)主键如果是整数类型,该列的值可以自动增长
NOT NULL - 非空:
约束列记录不能为空,否则报错
UNIQUE - 唯一:
除主键外,约束其他列的数据的值唯一
CHECK - 条件检查:
约束该列的值必须符合条件才可存入
DEFAULT - 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值

3.3
sqlite3常用指令
1)建立数据表
create table table_name(field1 type1, field2 type1, ...);
table_name是要创建数据表名称,fieldx是数据表内字段名称,typex则是字段类型。
例,建立一个简单的学生信息表,它包含学号与姓名等学生信息:
create table student_info(stu_no interger primary key, name text);
2)添加数据记录
insert into table_name(field1, field2, ...) values(val1, val2, ...);
valx为需要存入字段的值。
例,往学生信息表添加数据:
Insert into student_info(stu_no, name) values(0001, alex);

3)修改数据记录
update table_name set field1=val1, field2=val2 where expression;
where是sql语句中用于条件判断的命令,expression为判断表达式
例,修改学生信息表学号为0001的数据记录:
update student_info set stu_no=0001, name=hence where stu_no=0001;

4)删除数据记录
delete from table_name [where expression];
不加判断条件则清空表所有数据记录。
例,删除学生信息表学号为0001的数据记录:
delete from student_info where stu_no=0001;

5)查询数据记录
select指令基本格式:
select columns from table_name [where expression];
a查询输出所有数据记录
select * from table_name;
b限制输出数据记录数量
select * from table_name limit val;
c升序输出数据记录
select * from table_name order by field asc;
d降序输出数据记录
select * from table_name order by field desc;
e条件查询
select * from table_name where expression;
select * from table_name where field in ('val1', 'val2', 'val3');
select * from table_name where field between val1 and val2;
f查询记录数目
select count (*) from table_name;
g区分列数据
select distinct field from table_name;
有一些字段的值可能会重复出现,distinct去掉重复项,将列中各字段值单个列出。

6)建立索引
当说数据表存在大量记录,索引有助于加快查找数据表速度。
create index index_name on table_name(field);
例,针对学生表stu_no字段,建立一个索引:
create index student_index on student_table(stu_no);
建立完成后,sqlite3在对该字段查询时,会自动使用该索引。

7)删除数据表或索引
drop table table_name;
drop index index_name;

4. sqlite3函数

//当数据库文件不存在时,sqlite3_open不会报错,会创建一个空文件

//而sqlite3_open_v2会报错,并且不会产生空的数据库文件

  1. int sqlite3_open(
  2. const char *filename, /* Database filename (UTF-8) */
  3. sqlite3 **ppDb /* OUT: SQLite db handle */
  4. );
  5.  
  6. int sqlite3_open_v2(
  7. const char *filename, /* Database filename (UTF-8) */
  8. sqlite3 **ppDb, /* OUT: SQLite db handle */
  9. int flags, /* Flags */
  10. const char *zVfs /* Name of VFS module to use */
  11. );
  12.  
  13. int sqlite3_close(sqlite3 *);

//回调函数是检测到有一条记录就执行一次,有几条记录就执行几次

//p是&empty, argc是字段个数,argvv是字段名字, argv是字段值

  1. //int rscallback(void *p, int argc, char *argv[], char *argvv[])
  2. typedef int (*sqlite3_callback)(void*,int,char**, char**);
  1. int sqlite3_exec(
  2. sqlite3*, /* An open database */
  3. const char *sql, /* SQL to be evaluated */
  4. int (*callback)(void*,int,char**,char**), /* Callback function */
  5. void *, /* 1st argument to callback */
  6. char **errmsg /* Error msg written here */
  7. );
  1. ** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
  2. ** must be either NULL or else pointers obtained from a prior
  3. ** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
  4. ** not yet been released.
  5.  
  6. void *sqlite3_malloc(int);
  7. void *sqlite3_realloc(void*, int);
  8. void sqlite3_free(void*);
  1. **The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
  2. ** results into memory obtained from [sqlite3_malloc()].
  3. ** The strings returned by these two routines should be
  4. ** released by [sqlite3_free()]. ^Both routines return a
  5. ** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
  6. ** memory to hold the resulting string.
  7.  
  8. SQLITE_API char *sqlite3_mprintf(const char*,...);
  9. SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
  10. SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
  11. SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list);

返回结果:

  1. #define SQLITE_OK 0 /* Successful result */
  2.  
  3. /* beginning-of-error-codes */
  4. #define SQLITE_ERROR 1 /* SQL error or missing database */
  5. #define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
  6. #define SQLITE_PERM 3 /* Access permission denied */
  7. #define SQLITE_ABORT 4 /* Callback routine requested an abort */
  8. #define SQLITE_BUSY 5 /* The database file is locked */
  9. #define SQLITE_LOCKED 6 /* A table in the database is locked */
  10. #define SQLITE_NOMEM 7 /* A malloc() failed */
  11. #define SQLITE_READONLY 8 /* Attempt to write a readonly database */
  12. #define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
  13. #define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
  14. #define SQLITE_CORRUPT 11 /* The database disk image is malformed */
  15. #define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
  16. #define SQLITE_FULL 13 /* Insertion failed because database is full */
  17. #define SQLITE_CANTOPEN 14 /* Unable to open the database file */
  18. #define SQLITE_PROTOCOL 15 /* Database lock protocol error */
  19. #define SQLITE_EMPTY 16 /* Database is empty */
  20. #define SQLITE_SCHEMA 17 /* The database schema changed */
  21. #define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
  22. #define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
  23. #define SQLITE_MISMATCH 20 /* Data type mismatch */
  24. #define SQLITE_MISUSE 21 /* Library used incorrectly */
  25. #define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
  26. #define SQLITE_AUTH 23 /* Authorization denied */
  27. #define SQLITE_FORMAT 24 /* Auxiliary database format error */
  28. #define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
  29. #define SQLITE_NOTADB 26 /* File opened that is not a database file */
  30. #define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
  31. #define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
  32. /* end-of-error-codes */
  1. ** ^The sqlite3_errcode() interface returns the numeric [result code] or
  2. ** [extended result code] for the most recent failed sqlite3_* API call
  3. ** associated with a [database connection]. If a prior API call failed
  4. ** but the most recent API call succeeded, the return value from
  5. ** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode()
  6. ** interface is the same except that it always returns the
  7. ** [extended result code] even when extended result codes are
  8. ** disabled.
  9. **
  10. ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
  11. ** text that describes the error, as either UTF- or UTF- respectively.
  12. ** ^(Memory to hold the error message string is managed internally.
  13. ** The application does not need to worry about freeing the result.
  14. ** However, the error string might be overwritten or deallocated by
  15. ** subsequent calls to other SQLite interface functions.)^
  16. **
  17. ** When the serialized [threading mode] is in use, it might be the
  18. ** case that a second error occurs on a separate thread in between
  19. ** the time of the first error and the call to these interfaces.
  20. ** When that happens, the second error will be reported since these
  21. ** interfaces always report the most recent result. To avoid
  22. ** this, each thread can obtain exclusive use of the [database connection] D
  23. ** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning
  24. ** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after
  25. ** all calls to the interfaces listed here are completed.
  26. **
  27. ** If an interface fails with SQLITE_MISUSE, that means the interface
  28. ** was invoked incorrectly by the application. In that case, the
  29. ** error code and message may or may not be set.
  30. */
  31.  
  32. SQLITE_API int sqlite3_errcode(sqlite3 *db);
  33. SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
  34. SQLITE_API const char *sqlite3_errmsg(sqlite3*);
  35. SQLITE_API const void *sqlite3_errmsg16(sqlite3*);

5. 举例

5.1  数据库插入数据

  1. #include <sqlite3.h>
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. int ret;
  7. sqlite3 * db;
  8. char *err = NULL;
  9. char *sql = NULL;
  10. char id[];
  11. char name[];
  12. char age[];
  13.  
  14. //当数据库文件不存在时,sqlite3_open不会报错,会创建一个空文件
  15. //而sqlite3_open_v2会报错,并且不会产生空的数据库文件
  16. // ret = sqlite3_open_v2("mydatabase1.dat", &db, SQLITE_OPEN_READWRITE, NULL);
  17. ret = sqlite3_open("mydatabase1.dat", &db);
  18. if(ret != SQLITE_OK)
  19. {
  20. //printf("open database error!\n");
  21. fputs(sqlite3_errmsg(db), stderr);
  22. return -;
  23. }
  24.  
  25. ret = sqlite3_exec(db, "create table student(id integer primary key, name text, age integer);", NULL, NULL, &err);
  26. if(ret != SQLITE_OK)
  27. {
  28. fputs(err, stderr);
  29. return -;
  30. }
  31.  
  32. printf("please input student info:\n");
  33. printf("Id:\n");
  34. scanf("%s", id);
  35. printf("Name:\n");
  36. scanf("%s", name);
  37. printf("Age:\n");
  38. scanf("%s", age);
  39.  
  40. sql = sqlite3_mprintf("insert into student values(%s, %Q, %s);",
  41. id, name, age);
  42. ret = sqlite3_exec(db, sql, NULL, NULL, &err);
  43.  
  44. /*
  45. ret = sqlite3_exec(db, "insert into student values(4, 'XiaoLi', 23);", NULL, NULL, &err);*/
  46. if(ret != SQLITE_OK)
  47. {
  48. fputs(err, stderr);
  49. return -;
  50. }
  51.  
  52. sqlite3_free(sql);
  53. sqlite3_close(db);
  54. return ;
  55. }

5.2  显示数据库内容

  1. #include <sqlite3.h>
  2. #include <stdio.h>
  3.  
  4. //select查询用到的回调函数
  5. //回调函数是检测到有一条记录就执行一次,有几条记录就执行几次
  6. //p是&empty, argc是字段个数,argvv是字段名字, argv是字段值
  7. int rscallback(void *p, int argc, char *argv[], char *argvv[])
  8. {
  9. int i;
  10. *(int *)p = ; //有记录,我们就把empty改变成0
  11. for(i=; i<argc; ++i)
  12. printf("%s=%s ", argvv[i], argv[i]?argv[i]:"null");
  13. printf("\n");
  14. return ;
  15. }
  16.  
  17. int main()
  18. {
  19. int ret;
  20. sqlite3 * db;
  21. int empty=; //为1表示查询结果为空,没有匹配的记录
  22. char *err = NULL;
  23.  
  24. ret = sqlite3_open("mydatabase.dat", &db);
  25. if(ret != SQLITE_OK)
  26. {
  27. printf("open database error!\n");
  28. return -;
  29. }
  30.  
  31. ret = sqlite3_exec(db, "select * from student;", rscallback, &empty, &err);
  32.  
  33. if(ret != SQLITE_OK)
  34. {
  35. fputs(err, stderr);
  36. return -;
  37. }
  38.  
  39. if(empty)
  40. {
  41. printf("查询结果为空!\n");
  42. }
  43.  
  44. sqlite3_close(db);
  45.  
  46. return ;
  47. }

参考

1. http://www.jb51.net/article/44545.htm  Linux sqlite3 基本命令

2. http://www.cnblogs.com/hnrainll/archive/2011/09/08/2170489.html   Linux下用到数据库sqlite3

sqlite3 PC安装及使用的更多相关文章

  1. Windows 10 PC 安装 Docker CE

    系统要求 Docker CE 支持 64 位版本的 Windows 10 Pro,且必须开启 Hyper-V. 如果系统是win 10 家庭版安装 docker  很恶心, 我也是废了2天才安装, 由 ...

  2. 【数据库】SQLite3的安装

    版权声明:本文为博主原创文章,转载请注明出处. https://www.cnblogs.com/YaoYing/ SQLite3的安装 离线安装 SQLite3安装包 下载SQLite3安装包,将文件 ...

  3. Ubuntu下sqlite3的安装及使用

    Sqlite是一款轻型的数据库,实现了多数SQL-92标准,包括事务(原子性,一致性,隔离性和持久性 ACID),触发器与多数复杂查询.对于一个移动手持设备的应用开发者,Sqlite是居家旅行必备数据 ...

  4. 树莓派进阶之路 (028) - 树莓派SQLite3的安装

    MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景 ...

  5. IBM Power PC安装sysbench 执行mysql基准测试 --- sysbench安装

    第一步:下载Sysbench http://dev.mysql.com/downloads/benchmarks.html 第二步:解压sysbench 第三步:执行安装步骤 1. ./autogen ...

  6. 分享一个用安卓手机就能引导pc安装linux系统办法

    1.首先安卓手机下载软件DriveDroid.apk http://pan.baidu.com/s/1qW4pbT6 2.下载linux镜像文件放手机存储卡存储,放到Download/images/以 ...

  7. pc安装完成charles成功,小米安装crt证书失败

    问题描述: 今天在学习爬虫爬取APP内容时,需要安装crt证书.根据静谧大大的书,前面都挺顺利的.但在我的小米手机上安装crt证书时,出现了错误.手机显示无法安装. 解决之道: 1.不要用小米手机自带 ...

  8. 普通PC安装ESXi5.5以及以上的方法

    原贴内容 With ESXi 5, ESX no longer uses MBR for boot, it has gone to GPT-based partitions instead.    W ...

  9. 本地PC安装Centos 6.5 操作手册及遇到的问题

    我采取的是使用U盘安装 一.准备工作 1.下载Centos6.5 ISO文件 我在官网上下的6.5版本CentOS-6.5-x86_64-bin-DVD1.iso, 由于CentOS-6.5-x86_ ...

随机推荐

  1. 程序调控和监视(Logcat,Debug)

    1.Logcat 2.效果图:实现点击Button,提示Logcat信息 (1)activity_main.xml <?xml version="1.0" encoding= ...

  2. Swift数独游戏优化——C++与OC混编、plist自动生成

    一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Termin ...

  3. OC语言基础之NSArray

    0.数组的分类 NSArray :不可变数组 NSMutableArray : 可变数组 1: // @[] 只创建不可变数组NSArray 2: /* 错误写法 3: NSMutableArray ...

  4. 简单说说DNS劫持_firefox吧_百度贴吧

    简单说说DNS劫持_firefox吧_百度贴吧 DNSSEC

  5. WPF 中依赖属性的继承(Inherits)

    WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...

  6. 【记录一下】phpMyAdmin 4.5.0-beta1 发布,要求 PHP 5.5

    详情点击: [开源中国]http://www.oschina.net/news/65696/phpmyadmin-4-5-0-beta1 [phpMyAdmin]https://www.phpmyad ...

  7. 【mybatis】mybatis 中update 更新操作,null字段不更新,有值才更新

    示例代码如下: <update id="updateGoodsConfigQuery" parameterType="com.pisen.cloud.luna.ms ...

  8. XSS-Proxy之技术总结

    今天看了大风的文章,关于Cross Iframe Trick的思路.让我想到了曾经看到的关于XSS Proxy的一些文章. Advanced Cross-Site-Scripting with Rea ...

  9. mysql 将查询出来的某一字段组合成字符串

    select GROUP_CONCAT(id) as ids from yii_role_menu where roleId=1;

  10. 【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具

    iTop产品针对的主要应用场景为:内部IT支持.IT外包管理.数据中心运维管理和企业IT资产管理.常青管理从绿象认证产品中选取了iTop作为主要推荐产品,本类别的绿象认证产品还包括:OTRS和RT3等 ...