MySql初级篇:入门mysql这一篇就够了(bushi)

数据库与数据库概念

  • 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_numberm_namesynopsism_palytimem_timedirector
001你的名字2016-08-26106新海诚
002天气之子2019-07-19113新海诚
003声之形2017-09-08129山田尚子
# 创建电影表 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、savepointgrant、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; #员工的领导编号=领导的员工编号
image-20230223105003974

外连接

  • 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 数据库名>到导出地址

数据库设计三范式

  • 数据库设计范式:数据库设计原则
  • 种类:
    • 第一范式:要求任何一张表都必须有主键,每一个字段的原子性不可再分
    • 第二范式:在第一范式的基础上,要求所有非主键字段完全依赖主键,无部分依赖
    • 第三范式:在第二范式的基础上,要求所有直接依赖主键,不要产生传递依赖

按照范式进行设计数据库可以避免数据的冗余,空间的浪费

未完待续。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值