SQLite3的基本使用
|SQLite3简介
SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。
常用术语:表(table)、字段(column,列,属性)、记录(row,record)。
|SQL(structured query language)语句
特点:不区分大小写,每条语句后加";"结尾。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
数据定义语句(DDL:Data Definition Language)
- 新建表 ⟹ create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。);
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);
- 删除表 ⟹ drop:dorp table 表名;drop table if exists 表名;
DROP TABLE IF EXISTS t_person;
数据操作语句(DML:Data Manipulation language)
- 添加表中的数据 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。
INSERT INTO t_person (name, age) VALUES ('大明', );
- 修改表中的数据 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
UPDATE t_person SET name = '小明', age = ; // 把表中name字段的值全部改成小明,age字段的值全部改成10。
UPDATE t_person SET age = WHERE name = '小明'; // 把表中name字段值是小明的age值改为12。
- 删除表中的数据 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。
DELETE FROM t_person; // 删除表中的所有记录。
DELETE FROM t_person WHERE age = ; // 删除表中字段age等于25的这条记录。
DELETE FROM t_person WHERE age > AND age < ; // 删除表中年龄大于12且小于15的记录。
数据查询语句(DQL:Data Query Language)
- select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)
- 表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;
SELECT name, age FROM t_person WHERE age < ;
SELECT * FROM t_person WHERE age < ;
SELECT name, age nianling FROM t_person ren WHERE ren.age > AND nianling < ;
- 计算记录条数:select count(字段或者*) from 表名;
SELECT count(name) FROM t_person ren WHERE ren.age > ;
SELECT count(*) FROM t_person ren WHERE ren.age > ;
- where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
- order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
SELECT * FROM t_person WHERE age < ORDER BY age DESC, name ASC; // 先按年龄降序,再按名字升序。
- limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)
SELECT * FROM t_person WHERE age < ORDER BY age DESC, name ASC LIMIT , ; // 先筛选,后排序,再分页。
- like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
SELECT * FROM t_person WHERE name like '%明%';
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
实际上SQLite是无类型的,建表时声明的类型是为了方便程序员之间的交流,是一种良好的编程规范。
字段约束:
- not null:字段的值不能为空。
- unique:字段的值必需唯一。
- default:指定字段的默认值。
- primary key:主键,用来唯一的标识某条记录,相当于记录的身份证。主键可以是一个或多个字段,应由计算机自动生成和管理。主键字段默认包含了not null和unique两个约束。
- autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT );
外键:利用外键约束可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键的字段。
- 创建一个表:
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
- 创建一个带外键的表:t_student表中有一个叫做fk_student_class的外键,这个外键的作用是让t_student表中的class_id字段引用t_class表中的id字段。
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
- 利用外键来查询多张表中的数据:
SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; // 查询所有学生对应的班级
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班'); // 查询四班的所有学生
|SQLite3的使用
1、导入libsqlite3.dylib库,包含头文件#import <sqlite3.h>。
2、打开或者创建数据库。
sqlite3 *sq = NULL; // 一个打开的数据库实例
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"]; // 根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。
// 数据库文件的路径必须以C字符串(而非NSString)传入。
int result = sqlite3_open(path.UTF8String, &sq);
if (result == SQLITE_OK) {
self.sq = sq;
NSLog(@"打开数据成功");
const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
char *errmsg = NULL; // 用来存储错误信息
// 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
if (result == SQLITE_OK) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败:%@", [NSString stringWithUTF8String:errmsg]);
}
} else {
NSLog(@"打开数据库失败");
}
3、执行不返回数据的SQL语句。
- 执行创表语句。
const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
char *errmsg = NULL; // 用来存储错误信息
// 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
if (result == SQLITE_OK) {
NSLog(@"创表成功");
} else {
NSLog(@"创表失败:%s", errmsg);
} - 执行添加数据语句(增、删、改)。
NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_person (name, age) VALUES ('%@', %d);", @"夏明", ];
char *errmsg = NULL;
int result = sqlite3_exec(self.sq, sql.UTF8String, NULL, NULL, &errmsg);
if (result == SQLITE_OK) {
NSLog(@"添加数据成功");
} else {
NSLog(@"添加数据失败:%s", errmsg);
} - 执行更新、删除语句和执行创表、添加语句基本类似,只需更改sql语句即可。
4、执行返回数据的SQL语句(查)。
// 进行查询前的准备工作
const char *sql = "SELECT name, age FROM t_person WHERE age < 30;";
sqlite3_stmt *stmt = NULL; // 用来取数据的
// -1代表系统会自动计算SQL语句的长度
if (sqlite3_prepare_v2(self.sq, sql, -, &stmt, nil) == SQLITE_OK) {
NSLog(@"查询语句没问题");
// 每调一次sqlite3_step()函数,stmt就会指向下一条记录
while(sqlite3_step(stmt) == SQLITE_ROW) {
// 取出第0列字段的值
const unsigned char *name = sqlite3_column_text(stmt, );
// 取出第1列字段的值
int age = sqlite3_column_int(stmt, );
NSLog(@"name = %s, age = %d", name, age);
}
} else {
NSLog(@"查询语句有问题");
}
5、关闭数据库:sqlite3_close(db)。
|总结
1.打开数据库
int sqlite3_open(
const char *filename, // 数据库的文件路径
sqlite3 **ppDb // 数据库实例
);
2.执行任何SQL语句
int sqlite3_exec(
sqlite3*, // 一个打开的数据库实例
const char *sql, // 需要执行的SQL语句
int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
void *, // 回调函数的第1个参数
char **errmsg // 错误信息
);
3.检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2(
sqlite3 *db, // 数据库实例
const char *zSql, // 需要检查的SQL语句
int nByte, // SQL语句的最大字节长度
sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据
const char **pzTail
);
4.查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW
5.利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据
SQLite3的基本使用的更多相关文章
- iOS 数据存储之SQLite3的使用
SQLite3是iOS内嵌的数据库,SQLite3在存储和检索大量数据方面非常有效,它使得不必将每个对象都加到内存中.还能够对数据进行负责的聚合,与使用对象执行这些操作相比,获得结果的速度更快. SQ ...
- Android中如何使用命令行查看内嵌数据库SQLite3
转载博客:http://www.linuxidc.com/Linux/2011-06/37135.htm 在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令. [1]在Andro ...
- flask+sqlite3+echarts2+ajax数据可视化
前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。
安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...
- 安卓虚拟机adb shell sqlite3数据库
adb shell 连接: //http://www.cnblogs.com/xiaobo-Linux/ Android把数据都存放在data/data目录下. 我们使用cd命令转到data/data ...
- SQLite源程序分析之sqlite3.c
/****************************************************************************** ** This file is an a ...
- SQLite3源程序分析之查询处理及优化
前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...
- SQLite3源程序分析之虚拟机
前言 最早的虚拟机可追溯到IBM的VM/370,到上个世纪90年代,在计算机程序设计语言领域又出现一件革命性的事情——Java语言的出现,它与c++最大的不同在于它必须在Java虚拟机上运行.Java ...
- sqlite3的图片的(二进制数据)存取操作
sqlite3的图片的(二进制数据)存取操作 前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...
随机推荐
- Redis使用总结(3):实现简单的消息队列
参考Redis实现简单消息队列 Redis提供了两种方式来作消息队列.一个是使用生产者消费模式模式,另外一个方法就是发布订阅者模式.前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费 ...
- LeetCode - 46. Permutations
46. Permutations Problem's Link -------------------------------------------------------------------- ...
- Servlet生命周期中的service方法分析
问题ServletLifeCycle中的service方法内,有super.service(request, response); 会执行this.doGet(HttpServletRequest r ...
- 微信公众号入门学习2_使用C#,ASP.NET APIController如何被动回复用户消息
前言: 这里就可以凸显使用APIController的一个优势了,因为可以通过MVC的路由设置相同的路由,但改变请求的方式(HttpPost),可以单独写被动回复接口. 毕竟,微信服务器转入到咱们自己 ...
- 为什么要用 Bootstrap
[Bootstrap](http://hovertree.com/menu/bootstrap/) 是由两个 twitter 员工开发并开源的前端框架,非常火爆,而如此火爆自然有它的道理,在我们团队的 ...
- Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement
Connection.prepareStatement()函数出错,提示: Type mismatch: cannot convert from java.sql.PreparedStatement ...
- MSSQL存储过程返回自定义标识
比如我们要做一个登陆,要求严格的也许要进行很多的判断, 如果这时不用自定义返回变量,就会多写很多的代码判断,多次操作数据库... if exists(select * from sysyobject ...
- 第 12 章 CSS 入门
学习要点: 1.使用 CSS 2.三种方式 3.层叠和继承 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS(层叠样式表),它是用来对 HTML 文档外观的表现形式进行排版和格式化. 一.使用 ...
- 腾讯信鸽推送Android SDK快速指南
信鸽Android SDK是一个能够提供Push服务的开发平台,提供给开发者简便.易用的API接口,方便快速接入.目前支持Android 2.2及以上版本系统.本文档将引导用户以最快的速度嵌入信鸽SD ...
- 硬盘空间满导致mysql ibd文件被删后提示Tablespace is missing for table 'db_rsk/XXX"
昨天一早,开发人员反馈说一个测试环境报Tablespace is missing for table 'db_rsk/XXX",周末刚升级过,特地让开发回去查了下,说脚本中肯定没有drop ...