sqliteSQLite基础回顾

SQLite

iOS中的多寡存储方

  • Plist(NSArray\NSDictionary)
  • Preference(偏好设置\NSUserDefaults)
  • NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)
  • SQLite3
  • Core Data

SQLite

SQLite是一律款款轻型的嵌入式数据库
它们占用资源卓殊之不如,在嵌入式设备境遇,可能仅需要几百K的内存就够了
它们的处理速度比Mysql、PostgreSQL这半暂缓有名的数据库都还抢

啊是数据库

数据库(Database)是比照数据结构来组织、存储和管理数据的库
数据库可分开呢2颇类型
涉项目数据库(主流)
本着象型数据库

常用关系项目数据库

PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
嵌入式\举手投足客户端:SQLite
安存储数据
数据库是哪些存储数据的
数据库的储存结构与excel很像,以表明(table)为单位

数据库存储数据的步骤

新建数据库文件
新建一张表(table)
增补加多单字段(column,列,属性)
填补加多执行记录(row,每行存放多单字段对应的价值)

Navicat

Navicat是相同慢知名的数据库管理软件,协理大部分主流数据库(包括SQLite)
拔取Navicat建立数据库连接

SQL

SQL(structured query language):结构化查询语言
SQL是同等种植对干项目数据库被的多寡举行定义及操作的言语
SQL语言精练,语法简单,好学好用

SQL语句

下SQL语言编写出来的句子\代码,就是SQL语句
于程序运行过程遭到,要思量操作(增删改查,CRUD)数据库被之数据,必须运用SQL语句
特点
莫分轻重缓急写(比如数据库认为user和UsEr是同等的)
各条告句子都须以分公司 ; 结尾

SQL中之常用关键字

select、insert、update、delete、from、create、where、desc、order、by、group、table、alter、view、index......

数据库被无得以行使要字来命名表、字段

SQL语句之体系

数定义语句(DDL:Data Definition Language)
包括create和drop等操作
以数据库被开改进表或删除表(create table或 drop table)

数量操作语句(DML:Data Manipulation Language)
包括insert、update、delete等操作
方的3栽操作分别用于添加、修改、删除表中的数码

数量查询语句(DQL:Data Query Language)
得用来查询得到表中的数据
首要字select是DQL(也是具有SQL)用得极其多的操作
另DQL常由此的要紧字来where,order by,group by及having

字段类型

SQLite将数据划分为以下几栽存储类型:
integer : 整型值
real : 浮点值
text : 文本字符串
blob : 二迈入制数据(比如文件)

实质上SQLite是无类型的
即使表明也integer类型,依然会积存字符串文本(主键除外)
建表时声称啥类型或者未讲明类型且得,也就表示创表语句可以这么写:
create table t_student(name, age);

为保持卓绝的编程规范、方便程序员之间的交换,编写建表语句的时刻最好好长每个字段的实际品种

创表

格式

create table 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;
create table if not exists 表名 (字段名1 字段类型1, 字段名2 字段类型2,
…) ;
示例

create table t_student (id integer, name text, age inetger, score real) ;

删表

格式
drop table 表名 ;
drop table if exists 表名 ;
示例

drop table t_student ;

插数据(insert)

格式
insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;
示例

insert into t_student (name, age) values (‘zc’, 10) ;

注意
数据库中的字符串内容应该用单引号 ’ 括住

履新数据(update)

格式
update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ;
示例
update t_student set name = ‘jack’, age = 20 ;
注意
下边的示例会将t_student表中保有记录之name都更改吗jack,age都改变吗20

删去数据(delete)

格式
delete from 表名 ;
示例

delete from t_student ;

注意
上边的示例会将t_student表中具备记录还删掉

规则语句

设若单独想翻新或者去除某些固定的笔录,这就是必须在DML语句后增长有准

格语句的常见格式
where 字段 = 某个值 ; // 不克用半独 =
where 字段 is 某个值 ; // is 相当于 =
where 字段 != 某个值 ;
where 字段 is not 某个值 ; // is not 相当于 !=
where 字段 > 某个值 ;
where 字段1 = 某个值 and 字段2 > 某个值 ; // and非凡给C语言中之 &&
where 字段1 = 某个值 or 字段2 = 某个值 ; // or 卓殊给C语言中的 ||

示例
将t_student表中年纪过10 并且 姓名不等于jack的笔录,年龄都更改也 5

update t_student set age = 5 where age > 10 and name != ‘jack’ ;

删除t_student表中年纪小于等于10 或者 年龄大于30底记录

delete from t_student where age <= 10 or age > 30 ;

蒙下边告诉句的意

update t_student set score = age where name = ‘jack’ ;

将t_student表中名字等于jack的记录,score字段的值 都转移也 age字段的价

DQL语句

格式
select 字段1, 字段2, … from 表名 ;
select * from 表名; // 查询所有的字段

示例

select name, age from t_student ;
select * from t_student ;
select * from t_student where age > 10 ;  //  条件查询

起别名

格式(字段和表都可以于别名)
select 字段1 别名 , 字段2 别名 , … from 表名 别名 ;
select 字段1 别名, 字段2 as 别名, … from 表名 as 别名 ;
select 别名.字段1, 别名.字段2, … from 表名 别名 ;

示例

select name myname, age myage from t_student ;

受name起个叫myname的别名,给age起个称呼myage的号

select s.name, s.age from t_student s ;

给t_student表起分别名叫做s,利用s来引用表中的字段

统计记录之数码

格式
select count (字段) from 表名 ;
select count ( * ) from 表名 ;

示例

select count (age) from t_student ;
select count ( * ) from t_student where score >= 60;

排序

查询出来的结果好据此order by举行排序
select * from t_student order by 字段 ;
select * from t_student order by age ;

默认是依据升序排序(由小到大),也可成为降序(由大到稍微)
select * from t_student order by age desc ; //降序
select * from t_student order by age asc ; // 升序(默认)

为足以为此多独字段举行排序
select * from t_student order by age asc, height desc ;
事先以年排序(升序),年龄等就按身高排序(降序)

limit

动limit可以准确地操纵查询结果的数,比如每一次就询问10长数

格式
select * from 表名 limit 数值1, 数值2 ;

示例

select * from t_student limit 4, 8 ;

好领略啊:跳了最前头4修语句,然后取8条记下

limit
limit常因而来举行分页查询,比如每页固定展现5长长的数,那么应该如此取多少
第1页:limit 0, 5
第2页:limit 5, 5
第3页:limit 10, 5

第n页:limit 5*(n-1), 5

估算下面告诉句之图

select * from t_student limit 7 ;

相当于select * from t_student limit 0, 7 ;
意味着收获最好后边的7修记下

简易约束

建表时可以被一定的字段设置有些约原则,常见的封锁有
not null :规定字段的价值未克吧null
unique :规定字段的价值必须唯一
default :指定字段的默认值
sqlite,(指出:尽量为字段设定严俊的封锁,以保证数据的规范性)

示例

create table t_student (id integer, name text not null unique, age integer not null default 1) ;

name字段无法吧null,并且唯一
age字段不可知为null,并且默认为1

主键约束

如果t_student表中即便name和age三个字段,而且有些记录之name和age字段的值都同样不时,那么就是从未学分别这一个数量,造成数据库的记录不唯,这样虽未方便管理数据

好看的数据库编程规范应该使管各条记下之唯一性,为者,扩张了主键约束
也就是说,每张表都必须产生一个主键,用来标识记录的唯一性

啊是主键
主键(Primary Key,简称PK)用来唯一地标识某同长达记下
例如t_student可以加一个id字段作为主键,相当给人口之身份证
主键可以是一个字段或三只字段

主键的计划条件
主键应当是对用户没有意思之
世代为休想更新主键
主键不承诺涵盖动态变化的数量
主键应当由电脑自动生成

主键的讲明
于创表的时刻用primary key注解一个主键

create table t_student (id integer primary key, name text, age integer) ;

integer类型的id作为t_student表的主键

主键字段
苟注脚也primary key,就证实是一个主键字段
主键字段默认就隐含了not null 和 unique 五个框

若果想要于主键自动增长(必须是integer类型),应该多autoincrement

create table t_student (id integer primary key autoincrement, name text, age integer) ;

外键约束

用外键约束好据此来树表及申中的关系
外键的相似景色是:一张表的有字段,引用在另外一样张表的主键字段

新建一个外键

create table t_student (id integer primary key autoincrement, name text, age integer, class_id integer, constraint fk_t_student_class_id_t_class_id foreign key (class_id) references t_class (id)) ; 

t_student表中有一个誉为fk_t_student_class_id_t_class_id的外键
以此外键的来意是用t_student表中的class_id字段引用t_class表的id字段

表明连接查询

好家伙是注脚连接查询
待一起多张表才可以查看及想固然的数

阐明连接的型
外接连:inner join 或者 join (呈现的凡左右表都暴发完全字段值的笔录)
左外连接:left outer join (保证左表数据的完整性)

示例
询问大一底享有学员

select s.name,s.age from t_student s, t_class c where s.class_id = c.id and c.name = ‘大一’;

SQLite3

于iOS中应用SQLite3,首先要补加库文件libsqlite3.dylib和导入主头文件

创、打开、关闭数据库

始建或者打开数据库
// path是数据库文件之存放路径

sqlite3 *db = NULL;
int result = sqlite3_open([path UTF8String], &db); 

代码解析:
sqlite3_open()将按照文件路径打开数据库,假诺无有,则会创一个初的数据库。假诺result等于常量SQLITE_OK,则表示成功开拓数据库
sqlite3 *db:一个开辟的数据库实例
数据库文件之不二法门必须坐C字符串(而非NSString)传入

关闭数据库:sqlite3_close(db)

施行不回数据的SQL语句

实践创表语句

char *errorMsg = NULL;  // 用来存储错误信息
char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";
int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);

代码解析:
sqlite3_exec()可以举办其它SQL语句,比如创表、更新、插入和去操作。可是一般不要其执行查询语句,因为它们不会师回查询及的数额
sqlite3_exec()还足以进行的语句:
翻开事务:begin transaction;
回滚事务:rollback;
提交业务:commit;
拉动占位符插入数据

char *sql = "insert into t_person(name, age) values(?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL);
sqlite3_bind_int(stmt, 2, 27);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);

代码解析:
sqlite3_prepare_v2()再次来到值等于SQLITE_OK,表达SQL语句都准备成功,没有语法问题
带占位符插入数据
sqlite3_bind_text():大部分绑定函数都只暴发3单参数
第1独参数是sqlite3_stmt 类型
第2单参数指占位符的职务,第一单占位符的职位是1,不是0
第3个参数指占位符要绑定的价值
第4只参数指当第3独参数中所传递数据的长短,对于C字符串,可以传递-1代替字符串的长
第5独参数是一个可选的函数回调,一般用于在言语执行后成功内存清理工作
sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行了
sqlite_finalize():销毁sqlite3_stmt
对象

询问数据

char *sql = "select id,name,age from t_person;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
int _id = sqlite3_column_int(stmt, 0);
char *_name = (char *)sqlite3_column_text(stmt, 1);
NSString *name = [NSString stringWithUTF8String:_name];
int _age = sqlite3_column_int(stmt, 2);
NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);
}
}
sqlite3_finalize(stmt);

代码解析
sqlite3_step()返回SQLITE_ROW代表遍历到同长达新记录
sqlite3_column_*()用于取每个字段对应之价值,第2只参数是字段的目录,从0先导

网站地图xml地图