常用的服务型数据库Oracle、MySQL、postgresql等等都是关系型数据库,文档型数据库SQLite是用于移动端(手机、pad等等)存储数据
E-R关系模型
entry-relationship:实体-关系,一个实体转化成一个数据库中的表,关系包括一对一、一对多、多对多。关系转换数据库表中的一个列,在关系型数据库中一行就是一个对象
三范式
列不可拆分、唯一标识(主键必须)、引用主键(关系表示时只能引用主键)
数据完整性
1.数据类型:数字(int、decimal小数)、字符串(char、varchar、text大文本)、日期(datetime日期和时间)、布尔(bit二进制数据)
2.约束:主键(primary key)、非空(not null)、唯一(unique)、默认(default)、外键(foreign key)。表中只有一列为主键,唯一约束是表中有多个唯一约束列
3.逻辑删除:在列表中添加一列作为删除标记(本质就是修改操作update),如isDelete、DeleteFlag
数据库操作
1.创建数据库:create database 数据库名 charse=utf8;
2.删除数据库:drop database 数据库名
3.选择数据库:use 数据库名
4.列出所有数据库:show databases
表操作
1.列出所有表:show tables
2.新增表:create table 表名(列及类型)
create table s(id int auto_increment primary key),列id为int类型、自增长、主键
sname varchar(10) not null,sname字段为长度限制为10的字符
);
3.修改表:alter table 表名 add|change|drop 列名 类型
新增列、只能修改列的类型、删除列
4.删除表:drop table 表名
添加主键、外键
create table a(id int auto_increment primary key),列id为int类型、自增长、主键
sname varchar(10) not null,sname字段为长度限制为10的字符
foreign key(sid) reference s(id));列sid为外键关联表s的列id
插入语句
1.全列插入:insert into 表名 values(…) 赋值顺序和表中列顺序必须一致
2.缺省插入:insert into 表名(列1、列2…) values(值1、值2…)
3.同时插入多条数据:insert into 表名 values(…),(…),(…)…
insert into 表名(列1、列2…) values(值1、值2…),(值1、值2…),(值1、值2…)…
修改语句
update 表名 set 列1=值1,… where 条件
删除语句
delete from 表名 where 条件
备份和恢复
1.备份:mysqldump -u root -p 数据库名 > d:\db.bak
2.恢复:mysql -u root -p 数据库名 < d:\db.bak
恢复之前需要先创建一个数据库
查询
1.全表查询:select * from 表名
2.去重复行查询:select distinct 列名 from 表名
3.条件查询:select * from 表名 where 条件
(以下放在where关键字后面做查询条件)
4.逻辑运算符:and、or、not
5.比较运算符:=(等于)、>(大于)、>=(大于或等于)、 <(小于)、<=(小于或等于)、!=或<>(不等于)
6.模糊查询:like、%(表示任意一个或多个字符)、_(表示任意一个字符,可以用__匹配任意2个字符)
7.范围查询:in(值1,值2,…)在多个不连续的之中匹配
between … and …在一个连续范围内匹配
8.空判断
(1)null与空字符串不同
(2)判断是否为空 is null
查询条件优先级
小括号、not、比较运算符、逻辑运算符
and比or先运算,可以使用小括号提高运算等级
between 后面第一个and 被该关键字匹配
聚合函数
根据多行进行统计,生成的统计结果集,常用的5个聚合函数
1.count()统计行数,括号中写*或者列名结果相同:select count(*) from 表名
2.max()列最大值:select max(列命名) from 表名
3.min()列最小值:select min(列命名) from 表名
4.avg()列平均值:select avg(列命名) from 表名
5.sum()所有列的和:select sum(列命名) from 表名
分组
按字段分组:group by
select 列1,列2,聚合… from 表名 group by 列1,列2,列3,…
如:select gender as 性别,count(*)… from students group by gender
分组后数据筛选
对分组后的结果集进行筛选:having
select 列1,列2,聚合… from 表名 group by 列1,列2,列3,… having 列1,…聚合…
如:select gender as 性别,count(*)… from students group by gender having gender=1
select gender as 性别,count(*)… from students group by gender having count(*)>2
(where是对from后面的结果集进行筛选,having是对分组后的结果集进行筛选)
分页
1.select * from 表名 limit start,count
从start开始,获取count条数据,start的索引从0开始
2.每页显示m条数据,当前显示第n页,页数从1开始传:
select * from 表名 limit (n-1)*m,m
级联操作
1.限制(restrict):删除有外键关联的数据时,如果id存在则抛出异常
2.级联(cascade):主表记录删除所有关联记录都被删除
3.set null:将外键设置为空
4.no action:什么都不坐
逻辑删除可以解决外键删除问题
链接查询
1.表A inner join 表B:表A与B匹配的行会出现在结果中,没有匹配到的数据不显示,无论表A和B的前后顺序得到相同结果
2.表A left join 表B:表A与B匹配的行会出现在结果中,外加表A中独有的数据,未对应B的字段使用null填充
3.表A right join 表B:表A与B匹配的行会出现在结果中,外加表B中独有的数据,未对应A的字段使用null填充
自关联
当前表的一个字段引用自己的主键:
create table areas(id int auto_increment primary key),列id为int类型、自增长、主键
title varchar(50) not null,
foreign key(pid) reference areas(id));列pid关联当前表的id
视图
复杂查询的结果需要多次使用时,可以封装成一个视图
存在学生students、成绩scores、科目subject三个表
create view v_stu_sub_sco as
select student.*,subject.title,scores.score from scores
inner join students on scores.stuid=students.id
inner join subject on scores.subid=subject.id
where student.isDelete=1 and subject.isDelete=0
自关联查询
select * from areas as sheng where title=’山西省’
select * from areas as shi
以上两条语句join链接查询:
select sheng.id as sid,sheng.title as stitle,shi.id as shiid,shi.title as shititle from areas as sheng
inner join areas as shi on sheng.id=shi.id
where sheng.pid is null and sheng.title=’山西省’
limit 0,100
查询出山西省中的所有市的信息
一次查询性能测试
set profiling=1
执行SQL语句
show profiles
事物
当一个业务逻辑需要多个sql完成时,如果其中某条sql出错,则整个操作回滚
使用事物保障一个业务的完整性:原子性(业务不可再拆分)、一致性(执行的结果必须一致,顺序不同结果相同)、隔离性(不会授其他事物影响执行结果)、持久性(对于任意已提交的事物,系统必须保证数据完整不丢失)