MySQL的安装
–安装
linux下 yum 安装 mysql
命令:yum -y install mysql-server
–安装了却提示 mysqld:未找到命令
可能是因为没将mysql放入路径
解决bash: mysql: command not found 的方法
mysqld是mysql的守护进程,因此查询是查询这个
数据类型
–数据库常用数据类型
大致分成三种。数值,日期/时间,字符。
如何选择:日期按格式,数值和字符按大小。
MySQL数据类型
设计范式
三大设计范式
–第一范式(1NF)
字段为不可分割的原子值
越详细后期一些操作越方便,但具体看项目需求
–第二范式
满足第一范式的前提下,第二范式要求除主键外的每一列都必须完全依赖于主键
若是不完全依赖,只能发生在联合主键的情况下
若是不完全依赖,可以通过拆分表的方式使其满足完全依赖
(通俗理解:即其他字段可以通过完整的主键来唯一的确定自己的值,若是通过部分主键就能确定自己的值,那么就不满足2NF)
–第三范式
满足第二范式的前提下,除了主键列外的其他列不能有传递依赖关系。
范式主要是为了减少数据的 冗余
约束
–主键约束
能够唯一确定一张表中的一条记录,通过这个约束进行条件筛选可以选出一个唯一且不为空的数据字段。
创建方式——创建表时的在 数据属性后面加上primary key。
增删方式——alter table 表名 add/drop(增/删) primary key(属性名)。
修改方式——alter table 表名 modify(修改) 属性名 + 属性 primary key。
(方法通用)
-复合主键
复合主键是设置多个字段为主键来作为唯一的索引
(ps:联合主键中任意主键都不可为空)
创建方式——创建表的时候在加上primary key(主键一,主键二)。
-联合主键
多个表的主键联合在一起,以此确定一条唯一的记录。
–自增约束
在主键约束后加上auto_increment,这样可以使得我们在插入新数据的时候不必输入主键数值,而是让他自动生成一个递增的数值。
–唯一约束
约束的字段值不可重复
创建方式-和主键一样的方式,关键词是unique。
(ps:和主键区别,可以为空,并且可以多个unique,而主键是唯一的,且能使用自增)
删除方式-alter table 表名 drop index 属性名
–非空约束
约束字段不可为空NULL,关键词是 not null。
–默认约束
当我们放入数据时若是没有填写数据进去的话,就会使用默认值
关键词 default
–外键约束
指当前表的数值需满足另一个表的字段的数值的一种约束。
例如班级表一共有四个班,那么学生表中就不能出现四班以上的班级。
关键词 foreign key 当前字段 references 引用表(引用字段)。
(ps:主表中没有的数值副表不可使用,且主表中被引用的记录是不可被删除的)
常用命令
–启动mysql
service mysqld start
没有安装则会提示:未被识别的服务
(ps:命令后面记得加;号)
–查看数据库
show databases;
–创建数据库
create database + 表名;
–选择数据库
use + 数据库名
–查看数据表
show + 数据表名
–创建数据表
create table +表名(属性一 数据类型(数据大小),属性二 数据类型(数据大小)…)
–查看数据
select*form + 表名;
–查看数据(附带条件)
select*form 表名 where 属性=‘XX’;
–查看数据表的属性/结构
describe + 表名;
(可简写为desc+表名)
–插入数据
insert into + 表名 + values(‘数据1’,‘数据2’…);
–删除数据
delete from 表名 where 属性=‘XX’;、
–修改数据
update 表名 set 属性=‘新数据’where 属性=‘原数据’;
查询
–基本查询
selectfrom 表名;
此处的号代指所有数据
–指定字段查询
将select * from 表名;中的*换成想要查询的字段即可。
–剔除重复项查询
在select后加上distinct即可
–指定条件查询
在基本查询语句后+where 字段=想要的值;
–区间查询
如指定条件查询一样+where 字段 between XX and XX;
也可使用 字段 > XX and 字段 <XX 的方式;
–多项查询
在基本查询语句后+where 字段 in(值1,值2,值3);
–或条件查询
在基本查询语句后+where 字段=值1 or 字段2=值2;
–升降序查询
在基本查询语句后+order by 字段 asc/desc(升/降);
(ps:若是不写则默认升序 )
–多条件升降序查询
在升降序查询后+“,字段2 asc/desc(升/降);”
即在条件一相同的情况下再以条件二来排序。
–统计查询
select count(*)from 表名 where 字段 = XX;
–子查询(复合查询)
以其他字段为条件找到另外的字段
select 字段一 from 表名 where 字段二=(第二查询语句)
–最大最小,平均值查询
select max/min/avg(查询字段)from 表名 ;
–查询限制
在查询语句后加 limit X,Y;
X指从第几项开始查,Y指查几条
–分组查询
在查询语句后+ group by 字段;
–分组条件
在group by 字段 后加 having count(字段)>X,即可获得以字段总数>X为条件的分组
–模糊查询
like ‘查询的字+%’
此处%为通配符,即可以匹配所用数据
–多表查询
建立一个内连接来让两张表的数据互相调用查询
假设表一和表二共同拥有属性1
则可这样查询–select 表一属性2,表二属性2 from 表一,表二 where 表一.属性1=表二.属性1.
这样表二的属性1和表一的属性1就形成了一个连接,就可以以此查询表一的其他属性了。
–查询字段名称替换
在基本查询中*号位置的字段名称可被替换
例如select 属性一 as 代替名 from 表名;
(ps:as可以省略,只用空格即可)
–排除查询
如多项查询一般,但关键词是 not in
–合并输出
关键词为union,可以把两个查询语句的结果一起输出。
–任意、全部语句
在比较大小时后加any或all即可对比后面的任意数值(全部数值)。
–复制表数据查询
这是通过在同一张表的查询语句后加A/B来区分,这样就可以用同一张表的不同属性作为条件控制查询。
例:select * from 表名 a where 属性一 <(select avg(属性一) from 表名 b where a.属性二=b.属性二)
–查询运算
year(now())可用于运算年龄,在*号位置直接进行运算即可;
连接查询
SQL中有四种链接
–一种内连接
join 或 inner join
这种连接方式只显示两者都有的部分,即交集。
–三种外连接
-左连接
left join 或 left outer join
以左表为主,会显示左表所有的信息,左表有右表没有的则显示为空
-右连接
和左连接相反
-完全外连接
full join 或 full outer join
左右连接都有
mysql不支持全连接,故可用union来实现
事务
mysql中,事务为一个最小的不可分割工作单元,事务可以保证一个业务流程的完整性。
一件事务由多条执行语句完成,这些语句共同成功或共同失败。
例:银行转账,A扣钱和B加钱必须是一起完成的,不能出现只有一个完成的情况。
事务的开启
一般来说mysql的事务是默认开启的,即自动提交
可以用命令 select @@autocommit查看,1为开0为关。
用set 命令置0则关闭
在关闭状态下可以使用回滚命令 rollback 撤销上一次操作
但提交需要用手动提交命令 commit
事务的单独开启
在执行语句前输出 begin 或 start transcation 则可以对语句单独开启
在结束后手动 commit 即可持久化
事务的四大特征(acid)
A 原子性:事务是最小单位,不可以再分割
C一致性:事务要求同错同对
I隔离性:不同事务间互不干扰
D持久性:事务一旦结束则结果持久化
事务的四种隔离性
read uncommitted 读未提交的
read uncommitted 读已提交的
repeatable read 可以重复读(默认)
seralizable 串行化
查看事务的隔离级别
mysql 不同版本查询方式不一样
8.0 : select @@global.transation_isolation;
5.x : select @@global.tx_isolation;
select @@tx_isolation;
如何修改隔离级别
set transaction isolation level read uncommitted;
不同事务隔离情况会发生的问题
read uncommitted 由于这种隔离性读取的信息有可能会被撤回,因此会导致脏读
read commited 高并发情况有可能读取同一数据前后不一致的情况,因为中途可能会有其他人进行数据提交,这称为不可重复读
repeatable read 事务过程中同一张表被两个事务调用,A在查询时只能查到事务调用前的表,但执行时调用的是现在时的表,因此会出现幻读
seralizable 串行化,前一个事务在执行的情况下,后一个事务只能等待,问题是性能会很差
以上事务性能排序 read uncommitted >read uncommitted > repeatable read > seralizable
事务级别越高性能越差,但安全性更高。
此文为笔者的学习记录分享