数据库概论

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,那么第二张表就不用生成了)

  1. 一对多模式中,“一”是主表(一方),“多”是从表(多方)
  2. 在从表中使用外键关联主表的主键,达到一对多的目的
  3. 创建一张中间表,储存2张表的数据关系,达到多对多的目的
  4. 多对多可以拆分成为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);

你可能感兴趣的:(数据库概论)