首次接触MySQL的学习记录
数据库管理系统 (DBMS)
数据库/仓库 (DB)
SQL (结构化查询语言)
SQL分类
DQL语句 数据查询语言 select
DML语句 数据操作语言 insert delete update
DDL语句 数据库定义语言 create drop alter
TCL语句 事务控制语言 commit rollback
关于数据库的启动问题(已安装数据库但会报错,新手常会遇到)
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)
报该错误是是因为数据库未启动,解决方案如下:
点开计算机管理,找到服务选项,找到MySQL,点击启动,或者将启动从手动改为自动;
或者在窗口输入启动命令:net start mysql来启动数据库
数据库的常用基本命令
数据库的经典端口号为3306;
根用户为root
查看数据库版本号命令(登录数据库之前查看)
1.mysql --version
2.mysql -V
(登录数据库之后查看)
select version();
登录数据库命令
mysql -uroot -p***
(“***”)代表的是登录数据库的密码
退出数据库命令
1.exit
2.quit
进入数据库
1.显示数据仓库
show databases;
2.使用某个数据库
use mysql (use “数据库的名称”)
这块的“mysql”是数据库的名称
3.显示表
show tables;
4.查看仓库
select databases();
5.从一个仓库到另一个仓库的命令
show tables from mysql;
6.创建数据库
create database xiaobai;
//“xiaobai”指的是数据库的名称
7.导入数据库脚本
source 导入文件的路径
8.查看表
desc 表的名称;
(简单查询)查询单个字段和多个字段
1.单个字段 (select +字段的名称 from +表的名称);
2.多个字段 (select +第一个字段的名称,+第二个字段的名称 from +表的名称);
注意,查询多个字段时,中间的逗号用的是英文的半角逗号
3.全部字段 (select * from +表的名称);
注意,不推荐使用该方法查询,缺点:
语义不明确,查询效率低,可读性查,程序不健壮。
字段可以进行数学运算
例如:算员工一年的薪水:select sal12 form +表的名称;
给字段起别名,例如:select sal
12 as yearsal from +表的名称;
as可以省略(不推荐省略as,程序的可读性降低)
条件查询
注意:条件查询需要用到where语句,where必须放到from语句表的后面;
执行顺序:先form再where过滤后再检索出来。
支持的运算符:
<>不等于
between…and…两个值之间,等同于 >= and <=
is null 为空
and 并且
or 或者
in 包含,相当于多个or
not 可以取非,主要用在is或in中
like 称为模糊查询,支持%或下划线匹配%匹配任意个字符。下划线,一个下划线只匹配一个字符
操作符的使用*
= and or运算符的使用
例如查询薪水为5000的员工:
select name,sal from 表的名称 where sal = 5000; (<>使用方式与=类似)
查询薪水在1600-3000之间的员工:
1.select name,sal from 表的名称 where sal >1600 and sal < 3000;
2.select name,sal from 表的名称 where sal between 1600 and 3000;
sql语句中用单引号修饰字符串(标准语句)。
and优先级高于or
例如:查询薪水大于1800,并且部门编号为20或30的员工
select no,name,sal from 表的名称 where sal > 1800 and (no = 20 or no = 30);
is运算符的使用
查询没有/有补助的员工 (注意,这块不能使用=,应该使用is)
select name,comm from 表的名称 where comm is null;
select name,comm from 表的名称 where comm is not null;
like运算符的使用 %分配符 _占位符
查询名字中有带s的员工:
select name from 表的名称 where name like ‘%s%’;
名字首字母为s的员工:
select name from 表的名称 where name like ‘s%’;
名字第二个字母为d的员工:
select name from 表的名称 where name like ‘_d%’;
名字倒数第二个字母为n的员工:
select name from 表的名称 where name like ‘%n_’;
数据排序(asc,desc)
单一字段排序 order by 字段名称
作用:通过哪个或哪些字段进行排序
含义:排序采用order by 子句,order by 后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by 默认采用升序(asc),如果存在where子句,那么order by必须放到where语句的后面。
通过字段排序
单个字段排序
例如,按照薪水排序:
select name,sal from 表的名称 order by sal asc; (asc可省略,默认升序排列)
select name,sal from 表的名称 order by sal desc;(降序排列)
多个字段排序
例如,按照部门编号(从低到高)和薪资(从高到低)排序:
select deptno,name,sal from 表的名称 order by deptno,sal desc;
存在where子句时
例如,排序公司经理的薪水(由高到低,降序)
selsct job,name,sal from 表的名称 where job = ‘Manager’ order by sal desc;
通过字段下标排序
注意:字段下标,是当前查询到的表中的字段所处位置的下标,不是字段在表中位置的下标(不推荐使用,查询效率低,可读性差,容易出错,一旦表发生改变,字段的位置也随之改变)!
例如,你要查询的字段在表呈现后的第三个下标:
selsct job,name,sal from 表的名称 where job = ‘Manager’ order by 3 desc;
数据处理函数
单行处理函数(处理一行,输出一行)
lower | 转换小写 |
---|---|
upper | 转换大写 |
substr | 取子串(substr(被截取的字符串,起始下标(从1开始),截取的长度)) |
length | 取长度 |
trim | 去空格(前后空格) |
str_to_date | 将字符串转换成日期 |
date_format | 格式化日期 |
format | 设置千分位 |
round | 四舍五入 |
rand() | 生成随机数([0,1]的随机数) |
Ifnull | 可以将null转换成一个具体值 |
注意:数据处理函数是该数据本身特有的,有些函数可能在其他数据库不起作用
转化大小写的使用
例如将员工的姓名转为大/小写:
select upper(name) as uppername from 表的名字;
select lower(name) as lowername from 表的名字;
substr的使用
例如截取员工名字的首字母:
select substr(name,1,1) as name from 表的名字;
length和trim的使用
例如查询员工名字的长度:
select length(name) as namelength from 表的名字;
例如去除员工名字的前后空格(mysql语句默认去除后面的空格):
select * from 表的名字 where name = trim(’ king ');
round的使用
例如:
select round(123.56,0); 这个是四舍五入到个位,后面如果为1,那就四舍五入到十分位,如果为-1就四舍五入到十位…
rand的使用
select rand(); 生成[0,1]的随机数
生成[0,250]的随机数如何做:
select rand(rand()*250);
case_when_then_else_end函数的使用
例如:匹配工作岗位,当为MANAGER时,薪水上调10%,当为SALESMAN时,薪水上调50%,其他岗位薪水不变:
select job,name,
(case job
when ‘MANAGER’ then sal *1.1
when ‘SALESMAN’ then sal *1.5
else sal
end) as newsal from 表的名字;
ifnull的使用
例如求公司员工补助+薪水的总值:
select name,(sal*ifnull(comm,0))*12 as yearsal from 表的名字;
str_to_date(‘日期字符串’ , ‘日期格式’)的使用
MySQL日期格式:
%Y-----代表四位的年份—————%y----代表两位的年份
%m—代表月(01,02…12)————%c代表月,(1,2…12)
%d-----代表日
%H----代表24小时制——————%h代表12小时制
%i------代表分钟(00…59)
%S或%s----戴白哦秒(00,01…59)
例如查询1981-12-03入职的员工:
select name,hiredate from 表的名字 where hiredate = ‘1981-12-03’; (MySQL默认格式为年-月-日)
如果格式错误,需要用到str_to_date:
select name,hiredate from 表的名字 where hiredate = str_to_date(‘12-03-1981’ , ‘%m-%d-%Y’);
注:第一个字符串是日期格式,第二个字符串是你要告诉数据库你的日期格式是什么
总结:
1.日期是数据可本身的特色,也是数据库本身机制中的一个重要内容;
2.每个数据库处理日期时采用的机制都不一样,都有自己的一套处理机制,所以在实际开发中将日期字段定义为DATE类型的情况很少;
3.如果使用日期类型,Java程序将不能使用,实际开发中,一般会使用“日期字符串”来表示日期;
date_format的使用
作用:将 ‘日期类型’ 转换为特定格式的 ‘日期字符串’ 类型
用法:date_format(日期类型数据,‘日期格式’)
例如改变员工入职日期格式:
select name,date_format(hiredate,’%Y%m%d’) as hiredate from 表的名字;
多行处理函数/分组函数/聚合函数(多行输入,对应一行输出)
常用以下几种
sum | 求和 |
---|---|
avg | 取平均 |
max | 最大值 |
min | 最小值 |
count | 取得记录数 |
注意:
1.分组函数自动忽略空值,不需要手动增加where条件排除空值;
2.分组函数不能直接使用在where关键字后面;
sum的使用
例如求出员工薪水的总和:
select sum(sal) as sumsal from 表的名称;
avg的使用
例如求员工薪水的平均值:
select avg(sal) as avgsal from 表的名称;
max和min的使用
例如求员工工资的最大值和最小值:
select max(sal) as maxsal from 表的名称;
select min(sal) as minsal from 表的名称;
count的使用
1.例如查询补助为0的人数
select count(*) from 表的名称 where comm is null;
2.查询补助不为空的人数
select count(comm) as empNum from 表的名称;
distinct去除重复记录和分组查询及having数据过滤用法
distinct去除重复记录
作用:将查询结果中某一字段的重复记录去掉
用法:distinct 字段名或 distinct 字段名1,字段名2 … …
distinct 字段名A:去除与字段名A相同的记录
distinct字段名A,字段名B:去除与字段名A和字段名B同时相同的记录
注意: distinct只能出现在所有字段最前面,后面如果有多个字段及为多字段联合去重
1.例如查询公司有哪些工作岗位:
select distinct job from 表的名称;
2.查询工作岗位数量:
select count(distinct job) from 表的名称;
3.去除部门编号deptno和工作岗位job重复的记录:
select distinct deptno,job from 表的名称;
排序:
select distinct deptno,job from 表的名称 order by deptno;
分组查询:group by
作用:通过哪个或哪些字段进行分组
用法:group by 字段名称
1.找出每个工作岗位的最高薪水
select job,max(sal) as maxsal from 表的名称 group by job;
2.计算每个工作岗位的薪水,由低到高排序
select job,max(sal) as maxsal from 表 group by job roder by maxsal desc;
3.计算每个部门的平均薪水:
select deptno,avg(sal) as avgsal from 表 group by deptno;
4.计算不同部门不同岗位的最高薪水:
select deptno,job,max(sal) as maxsal from 表 group by deptno,job;
5.找出每个工作岗位的最高薪水,除MANAGER之外:
select job,max(sal) as maxsal from 表 where job <> ‘MANAGER’ group by job;
having数据过滤法(对分组后的数据不满意用该方法)
例如,找出每个工作岗位的平均薪水,要求显示平均薪水大于2000的
select job,avg(sal) as avgsal from 表 group by job having avgsal > 2000;
注:where和having的区别
where用在group by之前,having用在group by之后
select语句总结
一个完整的SQL语句如下:
select
----------xxxx
from
-----------xxxx
where
---------xxxx
group by
------------xxxx
having
------------xxxx
order by
---------xxxx;
以上语句的执行顺序:
1.from:将从硬盘上的表文件中加载到内存
2.where:将符合条件的数据行摘取出来,生成一张新的临时表
3.group by:根据列中的数据种类,将当前临时表划分成若干个新的临时表
4.having:可以过滤掉group by生成的不符合条件的临时表
5.select:对当前临时表进行整列读取
6.order by:对select生成的临时表进行重新排序,生成新的临时表
7.limit:对最终生成的额临时表的数据行进行截取
跨表查询
笛卡尔积现象
若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的乘积,这种现象成为笛卡尔积现象。
查询员工名称和部门名称:
ename --> emp
dname --> dept
select ename,dname frome emp,dept;
分类介绍
年代分类:SQL92 , SQL99
连接方式分类:
1.内连接:等值连接 , 非等值连接 , 自连接
2.外连接:左外连接/左连接 , 右外连接/右连接
3.全连接
SQL92语法(表名要起别名)
select ename,dname from emp as e,dept as d where e.deptno = d.deptno;
SQL99语法(掌握)
语法结构:select xxx from A表名 join B表名 on 表的连接调节 where 数据过滤条件;
例如:查询员工所对应的部门名称
select e.ename,d.dname frome emp e join dept d on e.deptno = d.deptno where 数据过滤条件; (等值连接)
注:在join前省略了inner关键字
非等值连接
例如:查询员工薪水所对应的薪水等级:显示员工名称,薪水,薪水等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
注:在join前省略了inner关键字
自连接
例如:查询员工所对应的领导名称:显示员工名称和领导名称
select a.ename,b.ename as leadername frome emp a join emp b on a.mgr = b.empno;
外连接 :A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录是,会自动模拟出null值与之匹配;
注意: 外连接的查询结果条数 >= 内连接的查询条数
左连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行;(省略关键字outer,在left后边)
例如:查找员工对应领导的名字
select a.ename,b.ename as leadername frome emp a left join emp b on a.mgr = b.empno;
左右连接可以互换:如上述查询结果可以写为
select a.ename,b.ename as leadername from emp b right join emp a on a.mgr = b.empno;
右连接 :包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行;(省略了关键字outer,在right后面)
例如查询员工所对应的部门名称:
select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;
全连接 (了解):包含左右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
多张表连接的语法格式:
select
----------xxxx
from
----------A表
join
----------B表
on
---------连接条件1
join
-------C表
on
-------连接条件2;
原理:A表和B表通过连接条件1连接之后,A表再和C表通过连接条件2进行连接;
子查询
定义:select语句嵌套select语句被称为子查询
注意:select子句可出现在select、from、where关键字后面,如下:
select …(select) (很少使用了解即可)
from …(select)…
where …(select)…
1.where关键字后的嵌套查询
例如找出薪水比公司平均薪水高的的员工,要求显示员工名和薪水:
select ename,sal from emp where sal > (select avg (sal) as avgsal from emp);
2.from关键字后的嵌套查询
例如找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级:
select t.avgsal,s.grade from (select e.deptno,avg(e.sal) as avgsal from emp e group by e.deptno) join salgrade s on t.avgsal between s.losal and s.hisal;
union合并(相加)集合
UNION(合并相加结果集)
例如查询工作岗位为manager和salesman的员工:
select ename,job from emp where job = ‘MANAGER’ union select ename,job from emp where job = ‘SALESMAN’;
注意:字段个数和字段类型一样
limit的使用
作用:(只在MySQL中起作用)获取一表前几条或中间某几行数据。
用法:limit起始下标为m,长度为n
m:记录开始的下表,默认从0开始,表示第一条记录;
n:指从第m+1条开始,取n条;
例如,查询表中前五行的信息:
select * from emp limit 0,5;
例如查询薪水前三名的员工:
select ename,sal from emp order by sal desc limit 3;
limit实现分页
页码:pageNo 页数 pageSize:3
第一页:1,2,3 limit 0,3
第二页:4,5,6 limit 3,3
第三页: 7,8,9 limit 6,3
-------------------limit(pageNo-1)*pageSize,pageSize
第四页: 10,11,12 limit 9,3
表
表(table):是数据库最基本的组成单元,数据库是用来存储数据的,数据库中有很多表,每一个表都是一个独立的单元,表也是一个结构化的文件,由行和列组成,航程为数据或记录,列称为字段,字段又包含:字段名称、字段类型、长度、约束。
创建表
语法格式:create table 表名称(字段名 类型(长度) 约束);
create table t_表名/tbl_表名(字段名称 字段类型 字段长度 字段约束);
MySQL常用数据类型
数据类型 | 占用字节数 |
---|---|
char | char(n) |
varchar | varchar(n) |
int | 4个字节 |
bigint | 8个字节 |
date | 8字节 |
float | – |
double | – |
BLOB | |
CLOB |
描述:
float/double:数值型
date:表示日期和时间
BLOB:Binary Large Object(二进制大对象)
CLOB:Character Large Object(字符大对象)
char:定长字符串,存储空间大小固定,使用char(2)来表示类型或状态
varchar:变长字符串,存储空间等于实际数据空间,只包含英文字符的字符串
int:表示整型,比如自增ID和表示数量
bigint:表示长整型,比如自增ID(数量比较大的情况下)
注意:char和varchar的对比:
1.都是字符串
2.varchar比较智能,可以根据实际的数据长度分配空间,比较节省空间,但在分配的时候需要相关判断,效率低
3.char不需要动态分配空间,所以执行效率高,但会导致空间的浪费
4.若字段中的数据不具备伸缩性,建议采用char存储
5.若字段中的数据具备很强的伸缩性,建议采用varchar类型存储
例,创建表和删除表
学号:no int(4)
姓名:name varchar(32)
性别:sex char(1)
出生日期:birth date
邮箱:email varchar(128)
create table t_student(
no int(4),
name varchar(32),
sex char(1),
birth date,
email varchar(128)
);
删除表:
drop table t_student;
drop table if exists t_student;
复制表语法:
create table 表名 as 查询语句
DML语句:insert,update,delete
insert语法(新增一条数据):
insert into 表名(字段名,字段名,字段名,字段名) value (字段值,字段值,字段值,字段值);
insert into t_student(no,name,sex,birth,email) value(1,‘zhangsan’,‘1’,str_to_date(‘1949-10-01’,’%Y-%m-%d’),‘zhangsan@126.com’);
update语法(修改数据):
update 表名 set 字段名称 = 字段值,字段名称 = 字段值 where 限制条件;
update t_student set birth = str_to_date(‘1951-10-10’,’%Y-%m-%d’) where no = 4;
delete语法(删除数据):
delete from t_student; (删除所有数据)
delete from t_student where no = 4; (删除编号为4的学生数据)
设置表中字段的默认值
create table t_student(
no int(4),
name varchar(32),
sex char(1) default ‘1’,
birth date,
email varchar(128)
);
insert into t_student(no,name) values(1,‘zhangsan’);
表结构的修改
创建表:
create table t_student(
no int(4);
name varchar(32)
);
修改表的结构:
添加:alter table t_student add email varchar(128);
修改表中数据:alter table t_student modify no int(8);
删除:alter table t_student drop email;
改变字段名:alter table t_student change name username varchar(32);
约束constraint
约束实际上是对表中数据的限制条件。
非空约束(not null)
作用:not null约束的字段不能为NULL值,必须赋具体数据;
create table t_user(id int(4),name varchar(32),not null,email varchar(128));
用户的姓名不能为空
唯一性约束(unique)
作用:unique约束的字段具有唯一性,不可重复
create table t_user(id int(4),name varchar(32) not null,email varchar(128) unique); (列级写法)
create table t_user(id int(4),name varchar(32) not null,email varchar(128), unique(email)); (表级写法)
用户的邮箱不能重复
非空约束与唯一性约束的联合使用
creat table t_user(
id in(4),
name varchar(32) not null unique
);
insert into t_user(id,name) values(1,‘lisi’);
insert into t_user(id,name) values(1,‘lisi’);(这个会报错)
主键约束PK(primary key)
主键涉及到的3个术语:主键约束,主键字段,主键值。
3个术语之间的关系:
表中某个字段添加主键约束之后,该字段被称为主键字段,主键字段中出现的每一个数据都被称为主键值;
主键的作用;
1.添加主键primary key的字段既不能重复也不能为空,效果与“not null nuique”相同,但本质事不同的,添加主键约束之后,主键不仅会有not null unique作用,而且主键字段会自动添加“索引–index”;
2.一张表应该有主键,若没有,表示这张表示无效的(即使表中的两行数据完全相同,但是由于主键不同,我们也认为是两行完全不同的数据);
主键根据个数分类:单一主键,复合主键
1.单一主键是给一个子段添加主键约束;
列级写法
create table t_user(
id int(4) primary key,
name varchar(32) not null
);
insert into t_user(id,name) values(1,‘lisi’);
insert into t_user(id,name) values(2,‘lisi’);
insert into t_user(id,name) values(2,‘lisi’);
第三个会报错,主键2重复
表级写法:
create table t_user(
id int(4) ,
name varchar(32) not null,
primary key(id,name)
);
表中主键的个数
无论是单一主键还是复合主键,一张表中主键约束只能有一个;
主键根据性质分为:自然主键、业务主键
1.自然主键:主键值若是一个自然数,并且这个自然数与业务没有任何各院系,这种主键称为自然主键;
2.业务主键:主键值若和当前表中的业务紧密相关,那么这种主键值称为业务主键;如果业务发生改变时,业务主键往往会受到影响,所以业务主键使用较少,大多情况使用自然主键。如身份证号位数扩展
increment函数(自动生成主键值)
MySQL数据库管理系统中提供了一个自增数字auto_increment,专门用来自动生成主键值,主键值不需要用户维护,也不需要用户生成,MySQL会自动生成。自增数字默认从1开始,以1递增:1、2、3、4…
create table t_user(
id int(4) primary key auto_increment,
name varchar(32) not null
);
insert into t_user(name) values(‘zhangsan’);
insert into t_user(name) values(‘lisi’);
delete from t_user where id=2;
注意:
此处删除了主键为2的用户,如果继续创建,不会生成编号为2的用户,主键会直接往下继续生成。
外键约束FK(foreign key)
外界涉及到的术语:外键约束、外键字段、外键值
三者关系:给某个字段添加外键约束之后,该字段成为外键字段,外键字段中的数据称为外键值。
外键个数:
1.单一外键:给某个字段添加外键约束
2.复合外键:给多个字段联合添加一个外键
外键在同一张表中可以有多个外键存在
例:设计数据库表用来存储学生和班级信息
学生表t_student包含sno,sname,classno,cname
学生信息和班级信息之间的关系:一个班级对应多个学生,典型的一对多关系
一对多关系注意事项
1.外界字段可以为null,外键为空的数据也叫做孤儿数据;
2.被引用的字段必须具有unique约束
3.有了外键引用之后,表分为父表和子表,以上父表:班级表t_class;子表:学生表t_student;创建表时先创建父表,再删除子表;插入数据时,先插入父表数据再插入子表数据;
drop table if exists t_student;
create table t_student(
sno int(4) primary key auto_increament,
sname varchar(32),
classno int(4),
constraint t_student_classno_fk foreign key(classno) references t_class(cno)
);
drop table if exists t_class;
create table if exists t_class(
cno int(4) primary key,
cname varchar(32)
);
intsert into t_class(cno,cname) value(100,'高三一班');
intsert into t_class(cno,cname) value(200,'高三二班');
intsert into t_class(cno,cname) value(300,'高三三班');
insert into t_student(sname,classno) calues('张三',100);
insert into t_student(sname,classno) calues('李四',100);
insert into t_student(sname,classno) calues('王五',400);
结论(classno值必须来自cno):为了保证t_student表中的classno字段中的数据必须来自t_class表中的cno字段中数据,有必要给t_student表中classno字段添加外键约束,classno称为外键字段,classno中的100、200、称为外键值,classno在这里是单一外键;
王五学生在添加时会报错,因为字段受到了外键约束;
例二:查询出学生所对应的班级名称
select
s.sname,c.cname
from
t_student s
join
t_class c
on
s.classno = c.cno;
级联更新与级联删除
用法:在添加级联更新与级联删除的 时候,需要在外键约束后面添关键字;
注意:级联跟新和级联删除操作谨慎使用,因为级联操作会将数据改变或者删除;
级联删除:on delete cascade
定义:在删除父表数据的时候,级联删除子表中数据;
语法:alter table 表名 drop foreign key 外键字段;
//删除
alter table t_student drop foreign key t_student_classno_fk;
//添加
alter table t_student add constraint t_student_classno_fk foreign key(classno)
references t_class(cno) on delete cascade;
级联跟新:on update cascade
//跟新
alter table t_student add constraint t_student_classno_fk foreign key(classno)
references t_class(cno) on update cascade;
存储引擎(MySQL特有的,其他数据库没有)
存储引擎得本质:
1.通过采用不同的技术将数据库存储再文件或内存中
2.每一种技术都有不同的存储机制,不同的存储机制提供不同的功能和能力
3.通过选择不同的技术,可以获得额外的速度或功能,改善我们的应用
查看表使用的存储引擎:
1.show create table 表名;
2.show table status like 表名;
常用的存储引擎
一、MylSAM存储引擎
1.是MySQL最常用的
2.使用三个文件表示每个量
a、格式文件–存储表的结构(mytable.frm)
b、数据文件–存储表的数据(mytable.MYD)
c、索引文件–存储表的索引(mytable.MYI)
3.可转化为压缩,只读表来节省空间
二、InnoDB存储引擎
1.InnoDB存储引擎是MySQL数据库的缺省引擎
2.特征:
a、每个InnoDB表再数据库目录中以.frm格式文件表示
b、InnoDB表空间tablespace被用于存储表的内容
c、提供一组用来记录十五性活动的日志文件
d、用COOMIT(提交)、SAVEPOINI及ROLLBACK(回滚)支持事务处理
e、提供全部ACID兼容
f、在MySQL服务器奔溃后提供自动恢复
g、多版本(MVCC)和行级锁定
h、支持外键及引用的完整性,包括级联跟新和删除
三、MEMORY存储引擎
1.使用ME,ORY存储引擎的表,因为数据存储在内存中,且行的长度固定,所以使得MEMORY存储引擎非常快
2.MEMORY存储引擎管理的表具有以下特征:
a、载数据库目录内,每个表均已.frm格式文件表示
b、表数据及索引被存储在内存中
c、表锁机制
d、字段属性不能包含TEXT或BLOB字段
3.MEMORY存储引擎以前被称为HEAP引擎
选择合适的存储引擎
1.MyISAM表最适合于大量的数据读而少量数据跟新的混合操作。MyISM表的另一种情形是使用压缩的只读表
2.如果查询中包含较多的数据跟新操作,应使用InnoDB。其行级锁机制和多版本的支持为数据读取和跟新的混合提供了良好的并发机制
3.使用MEMORY存储引擎非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据。
索引(index)
MySQL数据库中表的解索方式有2种:
1.全盘扫描(效率较低)
2.通过索引解索(提高查询效率)
什么情况下适合给表中字段添加索引:
1.该字段数据量庞大
2.该字段很少的DML操作
3.该字段经常出现在where条件中
索引的应用
创建索引
语法结构:
1.create index 索引名 on 表名(列名)
2.create unique index 索引名 on 表名(列名)
注:添加unique表示在该表中的该列添加一个唯一性约束
例:create index dept_dname_index on dept(dname);
查看索引
语法结构:
show index from 表名
例:shorw index from dept;
视图(view)
1.视图在数据库管理系统中也是一个对象,也是以文件形式存在的
2.视图也对应了一个查询结果,只是从不同的角度查看数据
创建视图
语法结构:create view 视图名称 as 查询语句;
例:create view myciew as select * from emp;
删除视图:drop view if exists myview;
作用:
1.隐藏表的实现细节
2.提高解索效率
数据库设计三范式
定义:设计数据库的时候所依据的规范,共有三个规范;
第一范式:主键、字段不能再分
定义:要iu有主键,数据库中不能出现重复记录,每一个字段是原子性不能再分;
第一范式结论:
1.每一行必须唯一,也就是每个表必须有主键,这是我们数据库设计的最基本要求
2.主键主要通常采用数值型或定长字符串表示
3.关于列不可分,应根据具体的情况来决定
第二范式:非主键字段完全依赖主键
定义:第二范式式建立在第一范式基础之上,要求数据库中所有非主键字段完全依赖主键,不能产生部分依赖;(严格意义上说:尽量不要使用联合主键)
结论:一种典型的“多对多”的设计
第三范式
定义:建立在第二范式基础之上,要求非主键字段不能产生传递性依赖于主键字段
结论:典型”一对多“的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方主键
事务(Transaction)
事务是什么
1.一个最小的不可再分的工作单元
2.通常一个事务对应一个完整的业务
3.一个完整的业务需要批量的DML语句共同完成
4.事务只和DML语句有关系,或者说只有DML语句才有事务
5.批量DML语句共有多少DML语句,这个和业务的逻辑有关系,业务逻辑不同,DML语句个数不同
事务的四个特征(ACID)
1.原子性(Atomicity)
事务是最小单元,不可再分
2.一致性(Consistency)
事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败
3.隔离性(Isoiation)
一个事务不会影响其他事务的运行
4.持久性(Durability)
在事务完成之后,该事务对数据库所作的更改将持久保存在数据库中,并不会被回滚
事务中的一些概念
1.开启事务:start transaction
2.结束事务:end transaction
3.提交事务:commit transaction
4.回滚事务:rollback transaction
和事务相关的两条SQL语句
1.commit 提交
2.rollback 回滚
事务开启和结束的标志
1.开启标志
任何一条DML语句执行,标指事务的开启
2.结束标志
a、提交:成功的结束,将所有的DML语句操作记录和底层硬盘文件中数据进行一次同步
b、回滚:失败的结束,将所有的DML语句操作记录全部清空
重点
1.在事进行过程中,为结束之前,DML语句是不会修改底层数据库文件中的数据
2.只是将历史操作记录以下,在内存中完成记录
3.只有在事务结束的,而且是成功结束的时候才会修改底层硬盘文件中的数据
MySQL事务的提交和回滚的演示
MySQL默认事务:自动提交
在MySQL数据库中,默认情况下,事务是自动提交的,也就是说,只要执行一跳DML语句,就开启了事务,并且提交了事务
关闭MySQL事务自动提交
1.事务成功用法:start transaction;commit;
第一步:start stansaction; 手动开启事务
第二步:DML语句…批量执行DML语句
第三步:commit; 手动提交事务(事务成功结束)
事务的隔离级别
隔离有4个级别
1.read uncommitted 读未提交
2.read committed 读已提交
3.repeatable read 可重复读
4.serializable 串行化
read uncommitted 读未提交(级别最低)
1.事务A和事务B,事务A为提交的数据,事务B可以读取
2.这里读取到的数据可以叫做”脏数据“或者”脏读Dirty Read“
3.读未提交隔离级别最低,这种级别一般只能在理论上存在,数据库默认隔离级别一般都高于该隔离级别
查看隔离级别
1.查看当前会话级隔离级别
select @@tx_isolation;
select @@session.tx_isolation;
2.查看当前全局隔离级别
@@global.tx_isolation;
select @@global.tx_isolation;
来源:oschina
链接:https://my.oschina.net/u/4411837/blog/4282096