文章目录
数据库与数据库概念
-
DB:数据库
存储数据的仓库,本质是文件系统,保存数据。
-
DBMS:数据库管理系统
操纵和管理数据库的大型软件,用于对数据库进行统一管理和控制
-
SQL:结构化查询语言
对数据库进行操作的语言
-
常见数据库
Oracle、MySQL、SQL Server
关系型(RDBMS)与非关系型(非RDBMS)数据库管理系统
-
关系型:以行与列的形式存储数据,也就是表。
表与表之间有关系,用关系模型来表示
-
非关系型:性能高
- 键值型数据库:Key-Value键值对的方式来查询-------Redis数据库
- 文档型数据库:可以存放获取文档------MongoDB数据库
- 搜索引擎数据库
- 列式数据库
- 图形数据库
设计原则
- 将数据放到表中,再将表放到库中
1.表、记录、字段
- E-R模型:包括实体集、属性、联系集
- 实体集:表中行—>实体或记录、列—>属性或字段,这两个组成了实体集也就是表。
2.表的关联关系:一对一、多对多、一对多、自我引用
MySQL数据库是一个C/S架构
- 由mysql数据库服务器 + 客户端可视化工具(Navicat等)
表
1.建表
-
建表:create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型);
-
常用数据类型:
- varchar :可变字符串长度,根据实际数据长度动态分配空间
- char:定长字符串长度,分配固定长度空间
- int :整型
- bigint:长整型
- float:单精度浮点型
- double:双精度浮点型
- date:短日期
- datetime:长日期
- clob:字符串大对象,可存储4GB的字符串,存储文章等
- blob:二进制大对象,专门用来存储图片、声音、视频等媒体数据,配合IO流使用
-
建表,删除表
# 创建一个学生表
create table t_student(
number int (10),
name varchar(5),
sex char(1),
age int(3),
email varchar(20)
)
# 删除表
drop table t_student;
drop table if exists t_student; # 如果表存在
-
创建表 newstudent,要求表结构和t_student一模一样,插入的数据也和t_student一样
create table newstudent select * from t_student where 1!=1; # where 1!=1 表示条件恒错,查询不到表中数据,会返回空表结构 insert into newstudent(sid,sname,age,sex) select * from t_student;
-
创建电影表
电影编号 | 电影名 | 剧情概要 | 上映日期 | 时长 | 导演 |
---|---|---|---|---|---|
m_number | m_name | synopsis | m_palytime | m_time | director |
001 | 你的名字 | … | 2016-08-26 | 106 | 新海诚 |
002 | 天气之子 | … | 2019-07-19 | 113 | 新海诚 |
003 | 声之形 | … | 2017-09-08 | 129 | 山田尚子 |
# 创建电影表 movie
create table t_movie(
m_number varchar(3),
m_name varchar(20),
synopsis varchar(255),
m_playtime date,
m_time varchar(5),
director varchar(10)
);
# 插入上表中数据
insert into t_movie values('001','你的名字','两人互换身体穿越时空的恋爱','2016-08-26','106','新海诚')
insert into t_movie values('002','天气之子','晴天少女阳菜与辍学高中生帆高的恋爱故事 ','2019-07-19','113','新海诚')
insert into t_movie values('003','声之形','听力障碍少女西宫硝子与石田将也的相互救赎','2017-09-08','129','山田尚子')
2.插入数据 insert
- 语法:insert into 表名(字段名1,字段名2,字段名3…) values(值1,值2,值3…)
字段名和值对应,数据类型要一致
# 在学生表中插入一条数据
insert into t_student(number,name,sex,age,email) value(001,'温家旺','男',20,'3301814646@qq.com');
insert into t_student values (001,'温家旺','男',20,'3301814646@qq.com');
-
插入日期
- mysql日期格式:年%Y、月%m、日%d、时%h、分%i、秒%s
- 数字格式化:format(数字字段,‘$格式’)
#给员工的工资格式化 select ename,format(sal,'$999,999') from emp;
- date类型转换成格式varchar类型:data_format(‘日期字段’,‘格式’)
#查询年份以(%Y/%m/%d)格式显示 select date_format(m_playtime,'%Y/%m/%d') as playtime from t_movie;
- 字符串varchar转换日期类型:str_to_date(‘日期字符串’,‘日期格式’),但是如果日期格式为例如’2022-10-1’这种格式的话,会自动转化成date类型。
#向电影表中插入一条数据,但是上映日期是字符类型
insert into t_movie values('004','想要哭的我带上了猫的面具','少女厌世暗恋男同学但是不小心变成猫这件事',str_to_date('10-09-2020','%m-%d-%Y'),'129','山田尚子')
insert into t_movie values('004','想要哭的我带上了猫的面具','少女厌世暗恋男同学但是不小心变成猫这件事','2020-10-09','129','山田尚子')
-
短日期类型(date)与长日期类型(datetime)的区别
- mysql短日期格式:%Y-%m-%d
- mysql长日期格式:%Y-%m-%d %h:%i:%s
- now()函数可以获取当前时间
插入多条
# 在学生表中插入多条学生信息
insert into t_student
values (2,'小红','女',18,'11111111@qq.com'),
(3,'小明','男',22,'222222222@qq.com'),
(4,'小刚','男',22,'33333333333@qq.com'),
(5,'小智','男',22,'444444444@qq.com');
3.修改 update
- 语法:update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3… where 条件子句;
# 更新电影表中004的导演
update t_movie set director='佐藤顺一/柴山智隆' where m_number=4;
4.删除 delete
- 语法:delete from 表名 where 条件子句;
- 原理:表中的数据被删除了(逻辑删除),但是数据在硬盘上的存储空间不会释放,所以delete语句删除效率比较低但是操作被记录日志可以回滚,数据可以恢复
# 删除电影表中number为004的记录
delete from t_movie where m_number=004;
- 快速删除表方法:
- truncate table 表名;表中数据被物理删除不可恢复,不会被mysql日志记录,速度快,但表还在
- drop table 表名; 表删除
5.对表结构的增删改 alter
-
修改表名
语法:alter table 旧表名 rename to 新表名;
-
删除字段
语法:alter table 表名 drop 字段名;
alter table newstudent rename to t_student;
-
添加字段
语法:alter table 数据表名 add 新字段名 新字段的数据类型 after/before 某字段;
- after/before 字段名可以省略
alter table t_student add city varchar(10) after sex;
-
修改字段名
语法: alter table 数据表名 change 旧字段名 新字段名 新字段的数据类型
alter table t_student change sid id varchar(3);
6.约束 constraint
- 创建表时,需要给表中的字段加入一些约束来保证表中数据的完整性和有效性
- 只允许列级约束,没有联合约束(表级约束)
非空约束 not null
- 约束的字段不能为null
# 新建表,表中name字段不能为空
drop table if exists t_vip;
create table t_vip(
id varchar(4),
name varchar(10) not null
);
insert into t_vip values('0001','小明');
insert into t_vip values('0001','小明');
insert into t_vip values('0001'); # Field 'name' doesn't have a default value
唯一性约束 unique
- 唯一性约束的字段不能重复,但是可以为null
#指定唯一性约束
drop table if exists t_vip;
create table t_vip(
id varchar(4),
name varchar(10) unique
);
insert into t_vip values('0001','小明');
insert into t_vip values('0002','小明'); # Duplicate entry '小明' for key 't_vip.name'
- 多个字段联合约束
drop table if exists t_vip;
create table t_vip(
id varchar(4),
name varchar(10),
unique(id,name) # 表示两个字段不能都重复
);
- 约束联合
- mysql中,如果一个字段同时被unique和not null修饰,则该字段为主键
# unique 和 not null 联合使用
drop table if exists t_vip;
create table t_vip(
id varchar(4),
name varchar(10) unique not null # =primary key PK 主键
);
主键约束 primary key (PK)
- 主键约束-主键字段-主键值
- 主键是表中一行记录的唯一标识,不能为null,且唯一,即not null约束且unique约束
- 复合主键:多个字段联合起来为主键
- 主键一般是数字,定长
- 主键自增:auto_increment
# unique 和 not null 联合使用
drop table if exists t_vip;
create table t_vip(
id varchar(4) primary key auto_increment,
name varchar(10) unique not null # =primary key PK 主键
# 或者 primary key(id)
);
外键约束 foreign key (FK)
- 外键约束-外键字段-外键值
- 外键引用的表的字段必须是关联表中的主键吗?—>不一定,但至少是唯一性约束(unique)的
- 外键字段可以为null
- 语法: foreign key(字段) references 引用表名(引用字段)
# 设计表student,class 学生表中引用外键班级号cno
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int(3) primary key auto_increment,
cname varchar(10)
);
create table t_student(
sid int primary key auto_increment,
sname varchar(10),
cno int(4),
foreign key(cno) references t_class(cno)
);
insert into t_class(cno,cname) values(1601,'1601班'),(1613,'1613班');
insert into t_student(sid,sname,cno) values(1,'小明','1613'),(2,'小芳','1601'),(3,'小苍','1613');
检查约束 check(MySQL5版本不支持,MySQL8版本后支持,Oracle支持)
- 设置记录符合条件的才能通过
# 设计表student,class 学生表中引用外键班级号cno
drop table if exists t_student;
create table t_student(
sid int primary key auto_increment,
sname varchar(10),
age int check (age>=0 && con<=120),
cno int(4),
foreign key(cno) references t_class(cno)
);
7.存储引擎
-
存储引擎是数据库表存储/组织数据的方式,不同存储引擎,表存储方式不同
-
engine指定存储引擎,charset指定字符编码集,默认:engine=InnoDB,charset=utf8
-
MySQL常用存储引擎:
- MyISAM 优点:可被转换为压缩、只读表来节省空间
- InnoDB :MySQL默认存储引擎,是一个重量级的存储引擎,支持事务,安全性高,数据库崩溃后自动恢复机制以保证数据的安全,但是不能很好的节省空间,不能被压缩,转只读
- MEMORY:查询效率高,数据存储在内存中,断电消失
单表查询
1.SQL分类
-
DQL(数据库查询语言):带有select都是查询语句
-
DDL (数据定义语言):create、alter、drop、rename、truncate
-
DML(数据操作语言):insert、delete、update、select
-
DCL(数据控制语言):commit、rollback、savepoint、grant、revoke
-
TCL(事务控制语言):commit、rollback
2.SQL使用规范与数据导入
-
每条命令以**;**或\g或\G结束
-
关键字不能被缩写或分行
-
关于标点符号
- 保证所有的()、单引号、双引号都是成对结束
- 英文状态输入
- 字符串和时间日期使用单引号’ '表示
- 列的别名,使用双引号" ",不省略as
-
大小写规范
- windows环境下大小写不敏感,****Linux环境下大小写敏感
- 统一书写规范:
- 数据库名、表名、表别名、字段名、字段别名都为小写
- SQL关键字、函数名、绑定变量都大写
-
注释
- 单行注释:#、–(后接空格)
- 多行注释:/* */
3.常用SQL语句
-
退出mysql:exit
-
查看数据库:show database;
-
使用数据库:use database;
-
创建数据库:create database name;
-
查看版本号:select version;
-
不见分号;不执行
4.表
- 数据库中最基本的单元是表table,以表格的形式存储数据
- 表包括行(row-记录)和列(column-字段)
5.简单查询
-
查询字段
select 字段名 from 表名;
select username from user;
- 查询多个字段,逗号隔开
select username,password from user;
- 查询所有字段
select *from user;
- 起别名:select 列名 as 别名 from 表名
select username as 'name',password as 'pd' from user;
6.条件查询
- 语法:select 字段 from 表名 where 查询条件;
查询条件(以员工表为例)
- =等于
#查询薪资等于800的员工姓名和编号
select ename,empno from emp where sal=800;
#查询字符串
select ename,empno from emp where name='smith';
- != 不等于
#查询薪资不等于800的员工姓名和编号
select ename,empno from emp where sal !=800;
select ename,empno from emp where sal <>800;
- <小于 >大于 <=小于等于 >=大于等于
#查询薪资小于3000的员工姓名和编号
select ename,empno,sal from emp where sal <3000;
#查询薪资大于3000的员工姓名和编号
select ename,empno,sal from emp where sal >3000;
#查询薪资小于等于3000的员工姓名和编号
select ename,empno,sal from emp where sal <=3000;
#查询薪大于等于3000的员工姓名和编号
select ename,empno,sal from emp where sal >=3000;
- between…and… 在什么之间
#查询薪资小于3000等于且大于等于800的员工姓名和编号
select ename,empno,sal from emp where sal >=800 and sal<=3000;
select ename,empno,sal from emp where sal between 800 and 3000;
- is null /is not null 为空/不为空
#查询津贴/补助为空的员工
select ename,empno,sal,comm from emp where comm is null;
#不为空的
select ename,empno,sal,comm from emp where comm is not null;
- and 并且
#查询工作岗位是manager并且工资大于2500的员工信息
select empno,ename,sal,job from emp where job='manager' and sal>2500;
- or 或者
#查询工作岗位是manager或者salesman的员工
select empno,ename,job from emp where job='manager' or job='salesman';
- and和or的优先级,and优先级高,用括号()提高or优先级
#查询工资大于2500,且部门编号为10或20的员工
select ename,sal,deptno from emp where sal>2500 and (dept=10 or dept=20);
- in/not in包含
#查询工作岗位是manager和salesman的员工
select ename,job from emp where job in('manager','salesman');
#查询薪资是800和5000的员工信息
select ename,sal from emp where sal in(800,5000);
#查询薪资不是800和5000的员工信息
select ename,sal from emp where sal not in(800,5000);
- 模糊查询like ,支持%和下划线_匹配
% 任意匹配多个字符,_匹配一个字符
#找出名字中含有w的
select ename from emp where like '%w%';
#找出名字以t结尾的
select ename from emp where like '%t';
#找出名字以t开始的
select ename from emp where like 't%';
#找出名字第三个字是温的
select ename from emp where like '__温%';
7.排序
-
distinct 关键字来指定某个或某些属性列唯一返回
-
order by 默认升序,order by … asc 指定升序,order by…desc 指定降序;
#查询员工的薪水,升序
select ename from emp order by sal;
select ename from emp order by sal asc;
#查询员工的薪水,若薪水一样则按照名字排序
select ename ,sal from order by sal asc,ename asc;
#找出工资在1500到3000之间的员工信息,要求按照降序排列
select empno,ename,sal from emp where sal between 1500 and 3000 order by sal desc;
8.数据(单行)处理函数
- 一个输入对应一个输出,而多行函数(聚合函数)是多个输入对应一个输出
- lower 转小写 ,upper 转大写
#将员工名字转小写
select lower(ename) from emp;
#将员工的名字大写
select upper(ename) from emp;
- substr 取子串
#利用sub函数查询首字母为A的员工名字
select ename from emp where substr(ename,0,1)='A';
-
trim 去空格
-
round (字段或值,保留的整数位)
-
rand 生成随机数
-
ifnull 处理空值
ifnull(数据,0) 吧空值当作零
#计算年薪时,薪水加补助*12,但当补助为null时,把他当作零来计算
select ename,(sal,ifnull(comm,0))*12 as yearsal from emp;
- case when…then when…than … else…end
当…时就…
#当员工的工作为clerk时,工资上涨1.8,当员工的工作为manager时,工资上涨1.2
select ename,job,sal
case job when 'clerk' then sal*1.8 when 'manager' then sal*1.2 as newsal
from emp;
9.聚合(分组)函数
- 输入多行,对应一个输出
- count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
-
注意:分组函数自动忽略null
count( * )和count(字段)又有什么区别,count(字段)统计不为null的数量,count( * )统计表中总行数
不能使用在where子句中
可以组合用
-
null 的表达式和任何数据进行运算结果都为null
10.分组查询
-
select …from …group by… ,通过group by进行分组
-
关键字执行顺序如下:
from>where>group by>having>select>order by>limit
-
分组之后的数据进一步过滤 having,但是不能代替where,必须和group by联合使用,但where优先级高
# 找出每个岗位的工资总和
select job,sum(sal) from emp group by job;
# 找出每个部门的最高薪资
select deptno,max(sal) from emp group by dept;
# 找出每个部门,不同工作岗位的最高薪资
select deptno,job,max(sal) from emp group by deptno,job;
# 找出每个部门最高薪资要求大于3000
select deotno,max(sal) from emp where sal>3000 group by deptno;
select deptno,max(sal) from emp group by deptno having max(sal)>3000;
# 找出每个部门的平均薪资,且薪资大于2500
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
综合例子
# 找出每个岗位的平均薪资,且平均薪资大于1500,出manager岗位以外,且 降序排列
select
job,avg(sal) as avgsal
from
emp
where
job not in ('manager')
# 或者 job !=('manager')/job <>('manager')
group by
job
having
avg(sal)>1500
order by
avgsal desc;
多表查询
1.去重 distinct
- distinct
- 当DISTINCT作用在多个字段的时候,它只会将多个字段值相加结果集都相同的记录“去重”掉。
# 查询工作岗位种类
select distinct job from emp ;
# 统计工作岗位的数量
select count(distinct job) from emp;
2.连接查询
-
多张表连接起来查询数据
-
链接方式
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接
- 右外链接
- 全连接
- 内连接
-
笛卡尔积现象
表连接次数越多,效率越低,需要减少表的连接次数
#两表之间查询乘积
select
e.ename,d.dname
from
# 表起别名
emp e,dept d
where
e.detpno=d.deptno;
内连接
等值连接
-
inner join … on… ,inner可以省略
-
案例
# 查询每个员工所在部门名称,显示员工名和部门名
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno=d.deptno; #条件为等量关系
非等值连接
- 案例
#找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select e.ename,e.sal,s.grade
from emp e
inner join salgrade s
on e.sal between s.losal and s.hisal; #条件不是等量关系
自连接
- 将一张表看成两张表
# 查询员工的上级领导,显示员工名和对应的领导名
select a.ename as '员工',b.ename as '领导'
from emp a
inner join emp b
on a.mgr=b.empno; #员工的领导编号=领导的员工编号
外连接
- left/right outer join … on … ,其中outer可省略,表示左/右表为主表,将主表结果全部查询出来,即使是条件没有匹配到的 !
# 查询每个员工的上级领导,显示员工所有的员工名字和领导名
select a.ename as '员工',b.ename as '领导'
from emp a
left outer join emp b # 将King的领导编号为null 查询出来,用领导表做主表
on a.mgr=b.empno; #员工的领导编号=领导的员工编号
多表连接
- 语法:join… on… join… on …right/left join… on … …
# 找出每个员工的部门名以及工资等级,显示员工名、部门名、薪资、薪资等级以及员工的上级领导
select e.ename,d.dname,e.sal,s.grade,leader.ename as '领导'
from emp e
join dept d on e.deptno=d.deptno
join salgrade s on e.sal between s.losal and s.hisal
left join emp leader on e.mgr=l.empno;
3.子查询
- select语句中嵌套select语句,嵌套的select语句被称为子查询
select ...(select)
from ...(select)
where ...(select)
where 子查询
- 案例
#找出比最低工资还高的员工姓名和工资
select
ename,sal
from
emp
where
sal>(select min(sal) from emp)
order by
sal asc;
-
注意:where判断中若出现 not in/in,( )不能用当前表的子查询
# 将子查询当做一张临时表 再放入in条件中 delete from emp where sal not in (select * from (select max(sal) from emp) t);
from 子查询
- from后面的子查询的查询结果,可以当做一张临时表
#找粗每个岗位的薪资等级
select t.*,s.grade
from (select job,avg(sal) as avgsal from emp group by job) t
join salgrade s
on t.avgsal between s.losal and s.hisal;
select 子查询
- select子查询只能返回1条结果
4.查询结果集
union 合并
- union效率高,对于表连接来说表的连接次数满足笛卡尔积,即为乘积,
而union可以减少表连接匹配次数**,将结果集相加,但是连接的表结构必须相同**
# 查询工作岗位是manager和salesman的员工
select ename,job from emp where job='manager' or job='salesman';
select ename,job from emp where job in ('manager','salesman');
# 用union合并结果集
select ename,job from emp where job='manager';
union
select ename,job from emp where job='salesman';
limit 截取
- 将查询结果的一部分取出
- 语法: limit startIndex,length ,起始下标和截取长度
#按照工资降序,取出工资排名前五的员工
select ename,sal from emp order by sal desc limit 5;
-
通用分页:(pageNo-1)*pageSize每页显示的记录条数
pageNo:当前页数 ,pageSize:每页显示的记录条数
事务 transaction
- 一个事务是一个完整的业务逻辑,一个最小的工作单元,例如转账
本质上是多条DML语句同时成功,同时失败
-
只有数据库操作语言增insert、删delete、改update语句,才和事务有联系
-
事务的执行过程中每一条操作都会记录到事务活动的日志文件中,我们可以提交事务,回滚事务
- 提交事务:清空事务活动日志文件,将数据彻底持久化到数据库表中,说明事务成功结束
- 回滚事务:将之前的DML操作撤销,清空事务活动日志文件,说明事物失败结束
- 提交事务: commit语句;
- 回滚事务:rollback语句;
-
mysql默认支持自动事务提交,每执行一句DML语句,提交
- 关闭mysql自动提交机制:start transaction;
-
事务四大特性:
- A:**原子性,**说明事物是最小的工作单位,不可再分
- C:**一致性,**同一事物中同时成功或者同事失败
- I:**隔离性,**事务与事务之间具有一定的隔离,类Java多线程安全
- D:**持久性,**事务提交,将数据保存到硬盘上
-
事务隔离级别:
-
已读未提交:read uncommited
事务A能读到事务B未提交的数据,出现脏读现象(dirty read)
这是理论上的隔离级别,大多数隔离是二级起步
-
已读提交:read commited
事务A能只读到事务B提交之后的数据,解决脏读现象,但是不可重复读取数据
Oracle数据库默认隔离级别是已读提交
-
可重复读:repeatable read
事务A开启之后,读取到的数据都是一样的,即使其他事务BCD已经将数据修改,但事务A读取到的还是原来的数据
解决了不可重复读问题,但是读取到的数据不真实
mysql,默认事务隔离级别为 可重复读
-
序列化/串行化:serializable
最高隔离级别,效率最低。表示事务排队不能并发类似Java中synchronize同步锁
-
索引 index
-
在数据库表字段上添加,数据库提高查询效率的一种机制,可以单个字段添加索引,也可以多个字段联合
-
实现原理
-
数据库中主键自动添加索引,mysql数据库中,如果有字段被unique修饰,也会自动添加索引
-
数据库中的任意一条记录在物理存储上(硬盘)都有一个物理存储编号
-
在MySQL中,索引是一个单独对象,不同的存储引擎以不同的形式存在
- 在MyISAM中,存储在.MYI文件中。
- 在InnoDB中,存储在tablespace文件名中
- 在MEMORY中,存储在内存中
但是不管存储在哪里,索引在mysql中都是以自平衡二叉树B-Tree存在
-
-
添加索引情况
- 数据量庞大
- 字段总是作为查询的条件
- 字段有很少的DML操作,因为经过DML后所以需要重新排序
-
索引的创建删除
- 创建索引:create index 索引名 on 表(字段);
- 删除索引:drop index 索引名 on 表名;
- 查看索引:explain
-
索引失效:
- 使用**模糊查询like时,以’%'开头是全表扫描,**使用了索引避免模糊查询
- 使用or时,要求两边都要有索引,如果其中一个没有,则索引会失效
- 使用复合索引时,没有使用左侧的字段查找,索引失效
- where条件中的字段参加了运算
- where条件中加入了函数
- …
-
索引是是数据库进行优化的重要手段,优化的时候优先考虑的就是索引
-
索引分类:
- 单一索引:一个字端上添加索引
- 复合索引:两个或以上字段联合添加索引
- 主键索引:主键上添加索引
- 唯一性索引:在unique约束修饰的字段添加索引
尽量不要在唯一性弱的字段上添加索引
视图 view
- 视图(view):在不同角度上看待同一数据
- 创建视图:create view 视图名 as select语句;
删除视图:drop view 视图名;
-
视图中的数据与表中的数据关联,修改视图也会修改表中的数据
-
作用:将需要经常使用的SQL查询语句封装起来,以视图的形式新建,在使用这条SQL与查询语句时直接使用试图对象
可以大大简化开发利于后期的维护,修改时只需要修改视图所映射的SQL语句就好了
增删改查CRUD
- 行业术语,增删改查一般被称为CRUD
- C create 新建
- R retrieve 查询检索
- U update 更新,修改
- D delete 删除
DBA常用命令
- 导入数据:source 绝对路径
- 导出数据:mysqldump 数据库名>到导出地址
数据库设计三范式
- 数据库设计范式:数据库设计原则
- 种类:
- 第一范式:要求任何一张表都必须有主键,每一个字段的原子性不可再分
- 第二范式:在第一范式的基础上,要求所有非主键字段完全依赖主键,无部分依赖
- 第三范式:在第二范式的基础上,要求所有直接依赖主键,不要产生传递依赖
按照范式进行设计数据库可以避免数据的冗余,空间的浪费
未完待续。。。。