sqliteSQLite基础回想

SQLite

iOS中的数据存款和储蓄格局

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

SQLite

SQLite是1款轻型的嵌入式数据库
它占用财富丰富的低,在嵌入式设备中,也许只必要几百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等操作
地点的三种操作分别用于增多、修改、删除表中的数量

数量查询语句(DQL:Data Query Language)
可以用于查询获得表中的多寡
根本字select是DQL(也是全数SQL)用得最多的操作
别的DQL常用的首要字有where,order by,group by和having

字段类型

SQLite将数据划分为以下两种存款和储蓄类型:
integer : 整型值
real : 浮点值
text : 文本字符串
blob : 2进制数据(举例文件)

事实上SQLite是无类型的
就是评释为integer类型,还能积累字符串文本(主键除此而外)
建表时声称啥类型可能不注脚类型都可以,也就代表创表语句能够这么写:
create table t_student(name, age);

为了保持优良的编程标准、方便技术员之间的沟通,编写建表语句的时候最棒增加每一种字段的求实品种

创表

格式

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

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 字段一 = 某些值 and 字段二 > 有些值 ; // and也正是C语言中的 &&
where 字段一 = 有个别值 or 字段二 = 有些值 ; // or 也就是C语言中的 ||

示例
将t_student表中年纪超过十 并且 姓名不等于jack的记录,年龄都改为 5

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

删除t_student表中岁数小于等于拾 或许 年龄超越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能够规范地决定查询结果的多寡,比如每一遍只询问十条数据

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

示例

select * from t_student limit 4, 8 ;

可以知道为:跳过最前方四条语句,然后取八条记下

limit
limit常用来做分页查询,比如每页固定突显伍条数据,那么应该那样取多少
第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 ;
代表取最前边的七条记下

简易约束

建表时方可给一定的字段设置有个别束缚原则,常见的牢笼有
not null :规定字段的值无法为null
unique :规定字段的值必须唯1
default :钦定字段的暗中同意值
(提议:尽量给字段设定严酷的约束,以保障数据的标准性)

示例

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

name字段不可能为null,并且唯1
age字段不能为null,并且默感觉壹

主键约束

如果t_student表中就name和age多少个字段,而且有个别记录的name和age字段的值都1致时,那么就没办法分别这一个数量,造成数据库的记录不唯1,这样就不方便管理数据

理想的数据库编制程序标准应当要力保每条记下的唯1性,为此,扩大了主键约束
也正是说,每张表都无法不有二个主键,用来标志记录的唯一性

怎么是主键
主键(Primary Key,简称PK)用来唯壹地标记某一条记下
例如t_student能够追加3个id字段作为主键,也就是人的身份证
主键能够是三个字段或四个字段

主键的规划标准
主键应当是对用户并未有趣的
永远也休想更新主键
主键不应包蕴动态变化的数目
主键应当由微型Computer自动生成

主键的扬言
在创表的时候用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) ;

外键约束

行使外键约束能够用来建立表与表之间的牵连
外键的形似景况是:一张表的有些字段,引用着另一张表的主键字段

新建3个外键

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表中有3个称作fk_t_student_class_id_t_class_id的外键
其1外键的成效是用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中央银行使SQLite三,首先要增加库文件libsqlite三.dylib和导入主头文件

创制、展开、关闭数据库

创制或展开数据库
// path是数据库文件的寄放路线

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

代码解析:
sqlite3_open()将根据文件路径张开数据库,要是不设有,则会创立三个新的数据库。假如result等于常量SQLITE_OK,则表示成功张开数据库
sqlite3 *db:二个开荒的数据库实例
数据库文件的路线必须以C字符串(而非NSString)传入

闭馆数据库:sqlite三_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_v贰()重临值等于SQLITE_OK,表达SQL语句已经计划成功,未有语法难点
带占位符插入数据
sqlite3_bind_text():超过5/10绑定函数都唯有贰个参数
第一个参数是sqlite叁_stmt 类型
第3个参数指占位符的职位,第七个占位符的职位是一,不是0
第3个参数指占位符要绑定的值
第四个参数指在第二个参数中所传递数据的长度,对于C字符串,能够传递-1代替字符串的尺寸
第多少个参数是3个可选的函数回调,一般用于在说话推行后产生内部存款和储蓄器清理专门的工作
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_*()用于获取各种字段对应的值,第1个参数是字段的目录,从0初叶

网站地图xml地图