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 (‘大明‘, 22);

  • 修改表中的数据 ? update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;

    UPDATE t_person SET name = ‘小明‘, age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。

    UPDATE t_person SET age = 12 WHERE name = ‘小明‘; // 把表中name字段值是小明的age值改为12。

  • 删除表中的数据 ? delete:delete from 表名;delete from 表名 where 字段 = 字段值。

   DELETE FROM t_person; // 删除表中的所有记录。

   DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。

   DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于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 < 80;

  SELECT * FROM t_person WHERE age < 80;

   SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;

  • 计算记录条数:select count(字段或者*) from 表名;

   SELECT count(name) FROM t_person ren WHERE ren.age > 80;

   SELECT count(*) FROM t_person ren WHERE ren.age > 80;

  • 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 < 100 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 < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。

  • 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 30);

外键:利用外键约束可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键的字段。

  • 创建一个表:

  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、打开或者创建数据库。

  •  1 sqlite3 *sq = NULL; // 一个打开的数据库实例
     2 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"];
     3
     4 // 根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。
     5 // 数据库文件的路径必须以C字符串(而非NSString)传入。
     6 int result = sqlite3_open(path.UTF8String, &sq);
     7 if (result == SQLITE_OK) {
     8     self.sq = sq;
     9     NSLog(@"打开数据成功");
    10     const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
    11     char *errmsg = NULL; // 用来存储错误信息
    12 //         可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
    13     result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
    14     if (result == SQLITE_OK) {
    15         NSLog(@"创表成功");
    16     } else {
    17         NSLog(@"创表失败:%@", [NSString stringWithUTF8String:errmsg]);
    18     }
    19 } else {
    20     NSLog(@"打开数据库失败");
    21 }

3、执行不返回数据的SQL语句。

  • 执行创表语句。

    1 const char *sql = "CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);";
    2 char *errmsg = NULL; // 用来存储错误信息
    3 // 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
    4 result = sqlite3_exec(self.sq, sql, NULL, NULL, &errmsg);
    5 if (result == SQLITE_OK) {
    6     NSLog(@"创表成功");
    7 } else {
    8     NSLog(@"创表失败:%s", errmsg);
    9 }
  • 执行添加数据语句(增、删、改)。

    1 NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_person (name, age) VALUES (‘%@‘, %d);", @"夏明", 22];
    2 char *errmsg = NULL;
    3 int result = sqlite3_exec(self.sq, sql.UTF8String, NULL, NULL, &errmsg);
    4 if (result == SQLITE_OK) {
    5     NSLog(@"添加数据成功");
    6 } else {
    7     NSLog(@"添加数据失败:%s", errmsg);
    8 }
  • 执行更新、删除语句和执行创表、添加语句基本类似,只需更改sql语句即可。

4、执行返回数据的SQL语句(查)。

  •  1 // 进行查询前的准备工作
     2 const char *sql = "SELECT name, age FROM t_person WHERE age < 30;";
     3 sqlite3_stmt *stmt = NULL; // 用来取数据的
     4 // -1代表系统会自动计算SQL语句的长度
     5 if (sqlite3_prepare_v2(self.sq, sql, -1, &stmt, nil) == SQLITE_OK) {
     6     NSLog(@"查询语句没问题");
     7     // 每调一次sqlite3_step()函数,stmt就会指向下一条记录
     8     while(sqlite3_step(stmt) == SQLITE_ROW) {
     9         // 取出第0列字段的值
    10         const unsigned char *name = sqlite3_column_text(stmt, 0);
    11         // 取出第1列字段的值
    12         int age = sqlite3_column_int(stmt, 1);
    13         NSLog(@"name = %s, age = %d", name, age);
    14     }
    15 } else {
    16     NSLog(@"查询语句有问题");
    17 }

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);      // 字符串数据

时间: 2024-10-12 11:26:40

SQLite3的基本使用的相关文章

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

MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景按需说明.本文介绍的SQLite技巧也可以在其他平台使用,并不局限于树莓派. 安装 SQLite 1 sudo apt-get update 2 sudo apt-get install sqlite sqlite3 3 #如果需要的话还可以顺便安装 PHP 相关组件 4 sudo apt-get

python安装sqlite3模块

Python安装sqlite3 环境为Ubuntu16.04 Apache2.4 Python2.7.13 django 1.8 今天部署apache+django,经过各种折腾,好不容易配置完了,发现错误Apache的日志里有一项 ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3 于是打开Python 测试

adb命令详解(二)——手机缺失sqlite3时操作数据库的多种解决方案

在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 下面我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方案. 1.当手机缺失sqlite3时,如何操作数据库 先来看看手机缺失sqlite3时候的效果图: 这个时候你想操作刚刚编写应用程序中执行的数据库文件内容,显然是执行不了sql语句的.下面我们将介绍三种方法让你可以查看应用程序下的数据库文件: ㈠向手机导入sqlite3文件 ①第一步,下载sqlite

sqlite3命令备忘录之查看表结构

Android内置了sqlite数据库,程序开发中经常使用到,已安装的程序,如何通过adb查看以创建的表结构呢? 在android下通过adb shell命令可以进入sqlite3的命令行client,见:在android命令行下使用sqlite3. 如果想列出该数据库中的所有表,可:.table 如果想查看这些表的结构:select * from sqlite_master where type="table"; 认情况下,不会出现红框中的表头,需要之前设置,命令为:.header

Cocos移植到Android的一些问题-SQLite3数据库移植问题

首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一种是从SQLite官网下载源代码拷贝的工程中.第一种方法配置起来比较麻烦,关键是Cocos2d-x提供的SQLite3库只是Win32没有其它平台的,目录结构如下所示.<游戏工程目录>\cocos2d\external\sqlite3│  Android.mk│├─include│      sq

python sqlite3使用详解

Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它使用一个文件存储整个数据库,操 作十分方便.它的最大优点是使用方便,功能相比于其它大型数据库来说,确实有些差距.但是性能表现上,SQLITE并不逊色.麻雀虽小,五脏俱全, sqlite 实现了多数 sql-92 的标准,比如说 transaction . trigger 和复杂的查询等. python的数据库模块有统一的接口标准,所以数据库操作都有统一的模式,基本上都是

sqlite3常用命令以及django如何操作sqlite3数据库

一.如何进入sqlite3交互模式进行命令操作? 1.确认sqlite3是否已经安装 进去python命令行,执行 >>> import sqlite3 >>> 没有报错,说明sqlite3已经成功安装了 2.如何进入sqlite3命令行 sqlite3 /path/to/dbname 直接执行sqlite3 加数据库名即可  ~ sqlite3 ~/Downloads/django_test/cmdb/db.sqlite3  sqlite3SQLite version

SQLite3 笔记

SQLite insert 插入一行: 插入一组: 使用select结果插入 多行插入到新表: 多行插入到新表,一步到位: 非常有用的临时表: sqlite update 更新一条记录: update 注意 约束 sqlite delete 约束: 唯一约束unique autoincrement 主键约束 域约束:默认值 时间戳默认值 NOT NULL 约束 check 约束 check 约束 复杂 外键约束 SQLite  存储类 视图 索引 触发器 视图触发器:可更新的视图 事务 冲突 S

golang sqlite3 CRUD

pacakge mainimport ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" // sqlite3 dirver ) // People have database fields type People struct { id int name string age int } type appContext struct { db *sql.D

sqlite3数据库的简要应用

Sqlite3数据库升级方案的变化. 1,  若是讲要升级的数据库版本更高,则从低版本数据库中拷贝与新数据库相同字段的内容,其他字段按照默认值创建.A->B->C这样逐个版本升级,每个版本升级对应一段代码.若是升级到更低版本数据库,则将数据库全部删掉重建. 2,  直接比对当前运行的数据库版本,和将要升级的最新的数据库版本(A->C),把相同的字段保存下来,不同的字段直接按照默认值方式升级.这样可以来回升级,尽量保存了更多的字段的内容. //创建一个table表,在insert语句(按照