1.数据类型
关系型:简单理解就是保存的数据是有联系的;如:person表和books表(表示某人看过的书)
非关系型:相对于关系型,保存的数据是没有关系的
2.常用的数据库
我们常用的数据口都是关系型的;如 MySQL(开源,后来被甲骨文收购6.x版本以后收费)、SQLServer(微软)、Oracle(甲骨文)
常用MySQL(轻量,免费)
而MySQL、Oracle、SQLServer 都使用用SQL(通用)数据库语言操作,他们也有自己的方言(不通用)
苹果SDK集成了SQLite(FFDB这个三方库,是封装使用的SQLite佼佼者)
3. 数据库操作语句
//创建数据库(没有就创建):
create database + name ([FMDatabase databaseWithPath:dbpath])
//查看数据库(iOS一般只有一个数据库,所以不太会用到这些语句):
//查询所有的数据库
show databases
//使用数据库(或者是叫选择数据库)
use + name
// 查看创建时数据库的信息
show creat database + name
//删除(小心使用!!!)
drop database + name
//修改(不能改名称,只能改编码和校对规则,非常少用)
4.表的字段类型和约束
//创建
create table name (
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束
);
//字段类型
//字符串
VARCHAR 可变 例如:定义了10个,保存的时候是8个,自动变为8个(节省内存)
CHAR 不可变 例如:定义了10个,保存的时候是8个,自动填充2个,变成10个
//字符
TEXT 文本内容,文章
//数值
INT BIGINT FLOAT DOUBLE
//日期
DATE :年月日
TIME :时分秒
DATETIME :年月日时分秒(传空,就是空)
TIMESTAMP :年月日时分秒(传空,取当前时间保存)
//逻辑(布尔)
BIT (1 或 0)
//大数据类型(不常用)
BLOB (字节),保存mp4,mp3
//约束(保证数据的完整性)
//主键约束(代表记录的唯一标识)
primary key (唯一 非空 被引用)
// 主键递增
auto_increment
//唯一约束
unique
//非空约束
not null
// 例子 :创建一个 person 表
creat table person(
id int primary key auto_increment, // 递增主键
name varchar(30), // 名字
gender char(3), // 性别
birhday date,// 生日
salary double,// 薪水
resume text // 履历
)
5.表的操作
//创建已经在上边介绍了这里就不写了
// 查看
show tables //查看所有的标
desc +表name // 查看表结构的详细信息
show create table + name //查看创建表的信息
// 删除(小心使用)
drop table + name
// 修改表
alter table name add 字段名称 数据类型 约束 // 添加一个新的字段
alter table name modify 字段名称 数据类型 约束 // 修改一个字段
alter table name drop 字段名称 // 删除一个字段
alter table name change 旧字段 新字段名称 数据类型 约束 // 修改一个字段的名字
rename table 旧表 to 新表名字 // 修改表的名字
//例子
alter table person add img bit //add img key
alter table person modify name char // 修改name的类型为 char
alter table person drop name // 删除name key
alter table person change name username char //重命名 name 为 username
rename table person to user // 重命名person 表为 user
6.数据的操作
//插入数据
//注意:字符串和日期类型必须用单引号括起来
//插入某些字段
insert into 表 (key1,key2,key3 ...)valuse(values1,values2,values...);
//插入默认数据(插入值的数量必须和表的字段数量相同)
insert into 表 valuse(values1,values2,values...);
//FMDB 使用示例
//NSString *sql = @"insert into t_student (name, age) values (?, ?)";
//[db executeUpdate:sql, @"zhangsan", [NSNumber numberWithInt:18]];
//修改
update 表 set key = values,key = values where 条件;
//FMDB 使用示例
//NSString *sql = @"update t_student set name = "heiheihei" where id = ?";
//[db executeUpdate:sql, [NSNumber numberWithInt:1]];
//删除
//注意:如果不加条件就是直接删除表的所有数据
delete from 表 where 条件
truncate 表 :直接删除表,数据不会恢复(而delete 是一行一行的删除数据,支持事务,可以恢复数据)
//FMDB 使用示例
//NSString *sql = @"delete from t_student where id = ?";
//[db executeUpdate:sql, [NSNumber numberWithInt:1]];
//查询
select * from 表 // "*" 表示表里边的全部字段
select key1,key2, key3 from 表 // 查询这3个key的数据
DISTINCT //去除重复的关键字
as // 起别名
select user ,english,chinese from stu;//查询学生的英语和中文成绩
select * from stu where English > 90 ;//查询英语>90的学生
select user ,english+10,chinese+10 from stu;//查询学生的英语和中文成绩并都给他们加上10分的特长分
select user , from stu;//查询学生的英语和中文成绩的总和
select user , as t from stu;//查询学生的英语和中文成绩的总和并起别名为t
select user , as t from stu where t > 150 ;//查询英语和中文成绩的总和大于150的学生
//FMDB
//NSString *sql = @"select id, name, age FROM t_student";
//FMResultSet *rs = [db executeQuery:sql];
7. where 使用
//常用的符号
< (小于) >(大于) <= (小于等于) >= (大于等于) <> (不等于)
in (范围)
like (模糊查询) “_” (一个占位符) “%” (多个占位符)
and 与
or 或
not 非
between ... and 之间
select * from stu where english in(80,90,100) ;//查询英语有没有 80、90或100 的学生
select * from stu where user like '小_' ; //查询小开头的学生(2个字的名字)
select * from stu where user like '小%' ; //查询小开头的学生(只要小开头就可以)
select * from stu where user like '%小%' ; //查询包含小的学生
select * from stu where English > 60 and English < 90 ; //查询英语 > 60 < 90 的学生
select * from stu where English between 60 and 90 ; //查询英语 > 60 < 90 的学生
8.排序
order by xxx(asc 升序 默认、desc降序)
//放到末尾
select * from xxx where xxx order by xxx ;
select * from stu order by english ; //英语成绩升序
select * from stu order by english asc; //英语成绩升序
select * from stu order by english desc; //英语成绩降序
select * from stu order by English desc,meth desc; //英语成绩降序 如果相同再按数学降序
select * from stu where like '小%' order by English desc; //姓小的英语成绩降序
9.聚集函数
求数量 求和 平均值 最大最小值
count()//求数量
select count(*) from sut;//有多少个学生
select count(id) from sut;//有多少个学生
select count(meth) from sut where meth > 90;//有多少个学生数学大于90
select count(*) from sut where (meth+english) > 180;//有多少个学生数学和英语大于180
sum()//求和
select sum(meth) from sut;//统计班级学生数学总分
select sum(meth + english) from sut;//统计班级学生数学+英语的总分
avg()//平均值
select avg(meth) from sut;//统计班级学生数学平均分
max(),min()//最大最小值
select max(meth) from sut;//班级学生数学最大值
select min(meth) from sut;//班级学生数学最小值
10.分组
数据安某个类型分开(其实默认情况下,所有的数据为一组)
group by xxx
select gender,sum(meth) from sut group by gender;//统计男女的数学总成绩
select gender,sum(meth) from sut group by gender having sum(meth) > 100 ;//统计男女的数学总成绩并且大于100
//这里不能用 where,如果:使用where 表示先执行where 条件筛选,再分组,上边的例子是先分组
//数学成绩大于80,在男女的数学总成绩并且大于100
select gender,sum(meth) from sut where meth >80 group by gender having sum(meth) > 100 ;
11.外键约束
保证数据的完整性(如果设置了外键,就不能直接删除父数据,如果关联数据没有以后,可以直接删除)
foreign key (xxx) references xxx 表 (xxx)// 外键xxx 映射到xxx表的xxx key
//例子
create table class(
id int primary key auto_increment, // 递增主键
name varchat,//班级名称
);
create table stu(
id int primary key auto_increment, // 递增主键
name varchar(30), // 名字
gender char(3), // 性别
birhday date,// 生日
dno,//外键
foreign key (dno) references class (id)// 外键dno映射到class表的id 表示学生和班级关联
);
12.多表设计
分类
一对一 (了解)
一对多(重点)
多对多(重点)
【注】1. 使2张表主键相同就可以达到一对一的目的(其实可以在一张表中多加几个另一张表的key,那么第二张表就不用生成了)
- 一对多模式中,“一”是主表(一方),“多”是从表(多方)
- 在从表中使用外键关联主表的主键,达到一对多的目的
- 创建一张中间表,储存2张表的数据关系,达到多对多的目的
- 多对多可以拆分成为2个1对多
13.多表查询
//笛卡尔积:2个结果乘积
select *from class,stu;//笛卡尔积(如果2条班级,4条学生,得到8条数据)
//内连接
... inner join ...//普通内连接
//主表 从表 inner join on 主表的主键 = 外键
select *from class inner join stu on id = dno; //查询班级内连接学生
select *from class,stu where id = dno;//隐式内连查询(常用)
select *from class c,stu s where c.id = s.dno;//起别名调用防止字段名称一样,这样写比较清楚(常用)
//外连接
left outer join (left join)//左外连接
select *from stu left outer join class on id = dno;
select *from stu left join class on id = dno;
right outer join (right join)//右外连接
select *from stu right outer join class on id = dno;
select *from stu right join class on id = dno;
【注】
1.内连接查询的是2张表的交集
2.左外连接查询的是左表中所有的数据和2张表的主外键关联的数据
3.右外连接查询的是右表中所有的数据和2张表的主外键关联的数据
14.子查询
也叫嵌套查询,把一个查询语句的结果作为另一个查询语句的条件
// 查询英语成绩大于平均分的学生
select *from stu where english > (sellect avg(english) from sut);