MySQL

mysql数据库

一、入门介绍

1.1 SQL通用语法

  • SQL 语句可以单行或多行书写,以分号结尾
  • 可使用空格和缩进来增强语句的可读性。
  • MySQL数据库的SQL语句不区分大小写,关键字建议大写。
  • 除了数字类型,其他类型需要使用单引号,mysql可以双引号。但是建议使用单引号
  • 三种注释
    • 多行注释:/*注释内容*/
    • 单行注释:
      • --注释内容
      • #注释内容(mysql特有)

1.2 SQL分类

  • DDL(Data Definition Language)数据定义语言:用来定义数据库、表、列

    关键字:create,drop,alter

  • DML(Data Manipulation Language)数据操作语言:用来查询数据库中表的数据进行增删改

    关键字:insert,delete,update等

  • DQL(Data Query Language)数据查询语言:用来查询数据库中表的记录(数据)

    关键字:select,where等

  • DCL(Data Control Language)数据控制语言(了解):用来定义数据库的访问权限和安全级别,及创建用户

    关键字:GRANT,REVOKE等

1.3 登入、退出、备份

登入mysql

  • mysql -uroot -p密码
  • mysql -hip(ip地址)-uroot -p连接目标的密码
  • mysql - -hosp=ip -user=root - -password=连接目标密码

退出mysql

  • exit

  • quit


数据备份

  • mysqldump -u用户名 -p密码 数据库名称>保存的路径:数据备份
  • source 文件路径:数据还原(登入数据库-创建数据库-使用数据库-执行文件)

二、表的设计

2.1 数据库设计的范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式 (4NF)和第五范式(5NF,又称完美范式)

  • 第一范式(1NF):每一张表都应该有主键,每一列都是不可分割的原子数据项
  • 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码,不能产生部分依赖(不能有复合主键)
  • 第三范式(3NF):在2NF基础上,所有非主键字段直接依赖主键,不能产生传递依赖

2.1 多表之间的关系

  • 一对一

    • 理解:一个人只有一个身份证,一个身份证只能对应一个人
    • 实现方式:
      • 外键唯一:在任意一方添加唯一外键(此外键必须添加唯一约束)指向另一方的主键
      • 主键共享:在任意一方的主键上添加外键指向另一方的主键
  • 一对多/多对一

    • 理解:一个部门有多个员工,一个员工只能对应一个部门
    • 实现方式:两张表,在多的一方建立外键,指向一的一方的主键
  • 多对多

    • 理解:一个学生可以选择很多门课程,一个课程也可以被多名学生选择
    • 实现方式:多对多关系实现需要借助第三张关系表。关系表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

三、 DDL

3.1 操作数据库:CRUD

3.1.1 C(Create)创建
  • create database 数据库名称;:创建数据库
  • create database if not exists 数据库名称;:创建数据库,判断不存在,再创建
  • create database 数据库名称 character set 字符集名;:创建数据库,并指定字符集
  • **create database if not exists 数据库名称 character set gbk;**创建db4数据库,判断是否存在,并指定字符集为gbk
3.1.1 R(Retrieve):查询
  • show databases;:查询所有数据的名库
  • show create database 数据库名称;:查询某个数据库的字符集,查询某个数据库的创建语句
4.1.3 U(Update):修改
  • alter database 数据库名称 character set 字符集名称;:修改数据库的字符集
4.1.4 D(Delete):删除
  • drop database 数据库名称;:删除数据库
  • drop database if exists 数据库名称;:判断数据库是否存在并且删除
4.1.5 数据库其他指令
  • select database();:查询当前正在使用的数据库名称;
  • use 数据库名称;:使用数据库

4.2 操作表:CRUD

数据库数据类型

varchar:(最长255)可变长度的字符串,会根据实际的数据长度动态分配空间。

char:(最长255)定长字符串,不管实际的数据长度是多少,分配固定长度的空间去存储数据。使用不恰当的时候,可能会导致空间的浪费。

int:(最长11)数字中的整数型。等同于java的int。

bigint:数字中的长整型。等同于java中的long

float:单精度浮点型数据

double:双精度浮点型数据

date:短日期类型,只包含年月日

datetime:长日期类型,包含年月日时分秒

clob:字符大对象,最多可以存储4G的字符串。存储一篇文章,存储一个说明。超过255个字符的都要采用CLOB字符大对象来存储。

blob:二进制大对象,专门用来存储图片、声音、视频等流媒体数据。,往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,需要使用IO流才行

4.2.1 C(Create)创建

创建表的规范!

  • 必须指定自增主键,不要uuid。并且主键建立后最好不要再有数据修改的需求。
    • 占用的数据量更小
    • 数据顺序递增,不会导致索引节点的频繁分裂
    • 数字类型比字符类型效率更高
  • 创建表选择字段的时候,在符合业务需求的情况下尽量小,数据类型尽量简单
  • 显式申明存储引擎
  • 显式申明字符集
  • 对经常要查询的列添加索引或者组合索引
  • 对字段和表添加COMMENT
  • 字段尽量不要为NULL
    • NULL需要占用额外的空间存储
    • 进行比较的时候会更复杂,还会导致你select (column)的时候不准确
    • 含有NULL值的列,会对SQL优化产生影响,尤其是组合索引中
CREATE DATABASE IF NOT EXISTS `dev_ops_db`;

CREATE TABLE  IF NOT EXISTS `dev_ops_db`.`monitor_table_holiday` (

`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',

`holiday_date` date NOT NULL default '1999-01-01' COMMENT '节假日日期',

`holiday_name` varchar(36) NOT NULL default '' COMMENT '节假日名称',

PRIMARY KEY (`id`),

KEY `holiday_date` (`holiday_date`) #注意:最后一列,不需要加逗号!

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='节假日数据表';

4.2.2 R(Retrieve):查询
  • show tables;:查询某个数据库中所有的表名称

  • desc 表名;:查询表结构

4.2.3 U(Update):修改
  • alter table 表名 rename to 新的表名;:修改表名
  • alter table 表名 character set 字符集名称;:修改表的字符集
  • alter table 表名 add 列名 数据类型;:添加一列
  • alter table 表名 change 列名 新列名 新数据类型;:修改列名称 类型
  • alter table 表名 modify 列名 新数据类型:修改列名称 类型
  • alter table 表名 drop 列名;:删除列
4.2.4 D(Delete):删除
  • drop table if exists 表名;:删除表

四 DML:增删改表中的数据

4.1 添加数据

  • insert into 表名(列名1,列名2,.....列名n) values(值1,值2,…..值n);:列名和值要一一对应

  • insert into 表名([列名1,]列名2,.....列名n) values([值1,]值2,…..值n);:如果列名是自增可以忽略不写

  • insert into 表名 values(值1,值2,….值n);:如果表名后不定义列名,则默认给所有列添加值

  • insert into 表名 valuse ([列值],[列值]),([列值],[列值]),([列值],[列值]);:批量插入

  • insert into 表名 select语句:将查询结果插入到表中

有字段没有插入数据,默认值是NULL!

4.2 删除数据

  • delete from 表名 where 条件;:注意!!不加条件的话,则删除表中所有记录

  • delete from 表名;:不推荐使用(有多少条记录就会执行多少次删除操作效率低下)

  • truncate table 表名;: 推荐使用(效率更高,先删除表,然后再创建一张一样的表)

5.3 修改数据

  • update 表名 set 列名1=值1,列名2=值2…..where 条件;:如果不加任何条件,则会将表中所有记录全部修改。

注意:数据库不允许边查询边删除或修改!因为某一些情况,要删除/更新的字段业务比较复杂,也就是说where条件后面会跟上子查询

排错思路:

  1. 把子查询的结果创建临时表存储
  2. 把这个临时表作为原表删除的条件

五、DQL:单表查询

5.1 语法执行顺序

  1. FROMJOIN

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. DISTINCT

  7. ORDER BY:此时可以用as别名了

  8. LIMIT / OFFSET

5.2 基础查询

  • select 字段名1,字段名2…from 表名;:多个字段的查询格式:

  • select * from 表名;:所有字段的查询格式

  • select distinct 字段名... from 表名;:去除重复,distinct关键字一定要所有字段的最前面,如果有多个字段那么会先将多个字段联合,再去重


select查询出的字段可以进行数学运算

  • select 100*12;:两个操作数都为整数形,则做数学运算
  • select "123"+10;:只有其中一方为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运输
  • select "john"+10;:如果转换失败,则将字符型数值转换为0
  • select null+10; :只有其中一方为null,则结果肯定为null

5.3 条件查询

  • select 字段名1,字段名2…from 表名 where 条件查询语句;

    • =

    • <>或!=

    • <

    • >

    • >=

    • <=

    • and或&&

    • or或||

  • select 字段 from 表名 where 条件字段 between 查询参数 and 查询参数;between and 两个值之间,在使用的时候必须左小右大

  • select 字段 from 表名 where 条件字段 is not null;is null 查询字段为null

    #等同于
    SELECT * FROM user WHERE uid = null
    
  • select 字段 from 表名 where 条件字段 is not null;is not null 查询字段不为null

    #错误示范,不能够使用
    SELECT * FROM user WHERE uid != null
    
  • *SELECT 字段 FROM user WHERE 字段 IN (2,3,5);In 后面的值不是区间,而是具体的值

  • SELECT 字段 FROM user WHERE 字段 NOT IN (2,3,5);not in

    #查询包括2,3,5的数据,相当于or
    SELECT * FROM user WHERE uid = 2 or uid =3 or uid = 5
    
  • SELECT * FROM 表名 WHERE 列表 LIKE '模糊字眼+占位符+模糊字眼';:模糊查询

    • 占位符
      • _:单个任意字符
      • %:多个任意字符

5.4 排序查询

  • select 字段 from 表名 order by 排序字段1 排序方式1,排序字段2,排序方式2…..;

    • asc:默认升序

    • desc:降序

如果有多个排序条件,则当前边的条件值一样时,才会判断第二个条件。

5.5 分组查询和分组函数

5.5.1分组函数
  • count(字段):计数
    • count(*):不是统计某一个字段中数据的个数,而是统计总记录条数
    • count(col):表示统计某一个字段中不为null的数据总数量
  • max(字段):计算最大值
  • min(字段):计算最小值
  • sum(字段):计算和
  • avg(字段):计算平均值
5.5.2 分组查询
  • select 分组字段... , 聚合函数... from 表名 group by 分组字段..;
select sex,avg(math),count(id) from student where>70 group by sex
#错误语法
select money from 表名 where money> avg(money) //ERROR 1111 (HY000): Invalid use of group function

无效使用了分组函数?

原因sql语句中有一个语法规则,分组函数不可以直接使用在where子句中,因为sql语句的执行顺序,分组函数是在 group by之后执行的,而 group是在where 执行之后才会执行的

分组的查询细节

  1. 分组函数一般都会和group by 联合使用,并且任何一个分组函数都是在group by语句执行结束后才会执行的,当一条sql语句没有group by语句,整张表数据会自动成一组(相当于默认执行group by)

  2. 当一条语句中有group by,select后面只能跟分组函数和参与分组的字段

  3. group by后面可以跟多个分组字段,相当于/理解为将多个字段组成在一起成为一个字段再分组

  4. where和having的区别?

    1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足,则不会被查询出来。建议优先使用where过滤,再使用having,提高效率。

    2. where后不可以跟聚合函数,having可以进行聚合函数判断。

    select sex,avg(math),count(id) from student where>70 group by sex having count(id)>2; 
    

5.6 分页查询

  • select 字段 from 表名 limit 开始的索引,每页查询的条数;

  • select 字段 from 表名 limit 5;:取前5条数据、

计算出开始索引的公式!

开始的索引=(当前的页码-1)* 每页显示的条数

#每页显示3条记录
select *from 表名 limit 0,3; #第一页
select *from 表名 limit 3,3; #第二页
select *from 表名 limit 6,3; #第三页

5.7 数据处理函数

lower(col):查询出来转小写

upper(col):查询出来转大写

concat(col,col):将两个列的字符串的进行拼接

length(col):取长度

trim(字段/stirng):去空格

ifnull(col,预想值):如果col字段为null 那么就将该字段转换成一个预想值

DATE_FORMAT(now(),'%Y-%m-%d'):日期格式转换

case..when..then..when..then..else..end:看案例

select 
	ename,
	job, 
	sal as oldsal,
	(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal 
from 
	emp;

6、多表查询

笛卡尔积:若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的乘积,该现象称为笛卡尔积

七总join理论:
在这里插入图片描述

6.1 起别名

  • select math as '字段别名1',english as '字段别名2' from 表名 as '表别名';
select math as '别名1',english as '别名2' from 表名;

起别名的细节

  • as也可以省略不写,别名如果是中文需要用引号
  • 所有的派生表必须有别名!要不然在子查询中就会报错
  • 可以给表起别名,也可以给字段起别名
  • 多表查询中起别名的好处
    • 执行效率高
    • 可读性好
    • 多张表查询经常会出现相同字段的名称,此时就需要用添加表名,表明该字段是那一张表中的数据

6.2 多表查询的分类

6.2.1 内链接查询

定义:假设a和b表进行连接,使用内链接的话,凡是a表和b表能够匹配上的记录查询出来,这就是内链接。ab两张没有主副之分,两张都是平等的

6.2.1.1 隐式内连接(了解)

使用where条件消除无用数据

#查询员工和员工所在的部门
select 
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno
6.2.1.2显示内连接分为3种(掌握)
  • 等值连接:表的连接条件和where过滤条件分离,语句结构更加的清晰

    • select 字段列表 from 表名1 [inner] join 表名2 on 连接条件 where 数据过滤条件
    #查询员工和员工所在的部门
    select 
    	e.ename,d.dname
    from
    	emp e
    join
    	dept d
    on
    	e.deptno = d.deptno
    
  • 非等值连接

    • select 字段列表 from 表名1 [inner] join 表面2 on between and
    #查询员工名和员工工资和员工工资等级
    select 
    	e.name,e.sal,s.grade
    from
    	emp e
    join
    	salgrade s
    on
    	e.sal between s.loasl and s.hisal
    
  • 自连接:把一张表当作两张表查询,自己连接自己

    • select 字段列表 from 表名1 别名1 [inner]join 表面1 别名2 on 连接条件
    select 
    	e1.ename , e2.ename 
    from
    	emp e1 #员工表
    join
    	emp e2 #领导表
    on 
    	e1.mgr = e2.empno
    
6.2.3 外连接查询

定义:假设a和b表进行连接,使用外链接的话,a表b表中有一张是主表,一张是副表。能够完全匹配的记录查询出来之外,将主表的数据无条件的全部查询出来,捎带着查询副表,当副表没有匹配的记录时,会自动模拟出null值与之匹配。

外连接的查询结果条数永远>=内连接的查询结果条数

  • select 字段列表 from 表1 left [outer] join 表2 on 条件;:会把左边表里的所有数据取出来,而右边表中的数据,如果有相等的就显示出来。

  • select 字段列表 from 表1 right [outer] join 表2 on 条件;:反之

6.2.4 内外连接多表查询案例

多张表如何连接:A表和B表先进行表连接,连接之后A表继续和C表连接,以此类推

#找出每一个员工,员工部门名称,员工等级,上级领导
select
	e.ename
	d.dname
	s.grade
	e1.ename
from
	emp e
join
	dept d
on
	e.deptno = d.deptno
join
	salgrande s
on
	e.sal between s.losal and s.hisal
left join
	emp e1
on 
	e.mgr = e1.empno;
6.2.5 子查询

查询中嵌套查询,称嵌套查询为子查询,将子查询结果作为主查询的数据再进行操作。

6.2.5.1 自查询可以出现在哪里
  • 用在select后,作为要查询的数据

  • 用在from后,将子查询的结果当作一张临时表(作为数据来源)

    #查询出每一个部门的平均薪水,薪水等级
    select 
    	t.*,s.grade
    from
    	#先将每一个部门的平均工资查出
    	(select deptno,avg(sal) as avgsal from emp group by deptno) t
    join
    	salgrade s
    on
    	t.avgsal between s.losal and s.hisal
    
  • 用在where 和 Having后 作为过滤的条件,将子查询的结果当作条件进行判断

    #查询最高的工资是多少,并查询员工信息工资等于最高工资的。
    
    #第一步:查询平均工资
    select max(salary) from emp;
    #第二步:拿到平均工资的值条件判断
    select * from emp where salary=9000;
    
    #子查询:一条sql就完成这个操作。
    select*from emp where emp.salary=(select Max(salary) from emp);
    
6.2.5.2 子查询的结果
  1. 单行单列

    select * from emp where emp.salary<(select avg(salary)from emp);:子查询可以作为条件,使用运算符去判断。

  2. 多行单列

    select*from emp where dept_id in(select id from dept where name=“财务部” or name=“市场部”);:子查询可以作为条件,使用运算符in来判断

  3. 多行多列

    子查询可以作为一张虚拟表参与查询

6.3 联合查询

内链接是显示a表和b表on连接条件都有的部分 ,外链接是现实一个主表a全有的部分,副表b如果不满足on条件则用null替代。如果想要链接两张表,但是on条件不满足的话也都显示出来怎么办?

select··· union selec···;:将两张表的查询结果合并并且去重

# 显示两张表连接的部分和未连接的部分
select * from tb1_emp a left join tb1_dept b on a.deptId = b.id		1.先用左连查出左边都有的部分
union	3.将两个表链接去重
select * from tb1_emp a right join tb1_dept b on a.deptId = b.id	2.先用右连查出左边都有的部分

在这里插入图片描述

# 只显示两张表未连接的部分
select * from tb1_emp a left join tb1_dept b on a.deptId = b.id	where b.id is null
union	
select * from tb1_emp a right join tb1_dept b on a.deptId = b.id  where a.id is null

在这里插入图片描述

七、约束

作用:对表中的数据进行限定,保证数据的正确性、有效性和完整性

分类:

  • 主键约束:primary key
  • 非空约束:not null
  • 唯一约束:unique
  • 外键约束:foreign key

7.1 非空约束

作用:值不能为NULL

# 创建表时添加约束
create table student(
  id int;
  #name不能为空
  name varchar(20) not null
);
# 创建表完后,添加非空约束
alter table student modify name varcher(20) not null;

# 删除name的非空约束
alter table student modify name varcher(20);

7.2 唯一约束

作用:值不能重复

注意:在mysql中唯一约束限定的列的值可以有多个null

# 创建表时,添加唯一约束
create table student(
id int;
phone varchar(20)  unique (添加唯一约束) 
);

#删除唯一约束
alter table student drop index phone;

#在创建表后,添加唯一约束
alter table student modify phone varchar(20) unique;

7.3 主键约束

作用:值不能为空并且唯一

细节:一张表只能有一个字段为主键,主键就是表中记录的唯一标识

# 在创建表的时候,添加主键约束 
create table 表名(
id int primary key,(给id添加主键约束)
name varchar(20)
);

# 删除主键
alter table 表名 modify id int;#错误
alter table 表名 drop primary key;

# 创建完表后,添加主键
alter table 表名 modify id int primary key;

7.4 自动增长

作用:如果某一列是数值类型的,使用 auto_increment 可以来完成值的自动增长,以1递增。

细节:如果给主键添加自动增长时,数据不能有为0的数值

# 在创建表时,添加主键约束,并且完成主键自增长
create table student(
id int primary key auto_increment,
name varchar(20)
);

#删除自动增长
alter table student modify id int;

# 添加自动增长
alter table 表名 modify id int auto_increment;

7.5 外键约束

作用:让表于表产生关系,从而保证数据的正确性。

注意:

  • 外键值可以为null
  • 子表的外键值不能随便写,必须要在父表关联的值中
  • 外键字段引用其他表的某一个字段的时候,被引用的字段不一定要是主键,但是该字段至少具有unique约束
  • 在建立约束后表和表的增删改查规则
    • 删除数据的时候,先删除子表,再删除父表
    • 添加数据的时候,先添加父表,再添加父表
    • 创建表的时候,先创建父表,再创建子表
    • 删除表的时候,先添加子表,再删除父表
#t_student中的classno字段引用t_class表中的cno字段。此时t_student就是子表,t_class是父表
#在创建表时,添加外键
#创建父表
create table t_class(
	cno int,
  #添加主键
  primary key(cno),
  cname varchar(20)
);

#创建子表
create table t_student(
	sno int, 
  primary key(sno),
  sname varchar(20),
  classno int,
  /*
  foreign key(子表外键列) references t_class(父表字段)
  */
  foreign key(classno) references t_class(cno)
);



#删除外键
alter table 表名 drop foreign key 外键名称;

#创建表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名称) references 主表名称(主表列名称);

7.6 级联操作

同生共死 你懂吗?

级联操作有两种:级联删除(on delete cascade)、级联更新(on update cascade)

alter table 表名 add constraint 外键名称

foreign key(外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade;

八、事务

10.1 事务的基本介绍

事务只和DML语句相关,如果一个包含多个步骤的业务操作,被事物管理,那么这些操作要么同时成功,要么同时失败。

start transaction;:开启事务

rollback;:回滚

commit;:提交

10.2 数据库的事务提交

10.2.1 事务提交的两种方式

自动提交:mysql就是自动提交的,只要执行一条DML(增删改)语句会自动提交一次事务。

手动提交:Oracle数据库默认是手动提交事务,需要先开启事务,再提交

10.2.2 修改事务的默认提交方式
  • select @@autocommit;: 查看事务的默认提交方法:

    • 1:代表自动提交
    • 0:代表手动提交
  • set @@autocommit=0;:修改默认提交方法

10.3 事务的四大特征

  1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
  2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
  3. 隔离性:多个事务之间,相互独立。
  4. 一致性:事务操作前后,数据总量不变。

10.4 事务的隔离级别(了解)

多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题

10.4.1存在问题:
  • 脏读:一个修改数据的事务正在执行修改但是这个修改事务还未提交,这时有另一个读取数据的事务也请求了这个数据,这时这个读取事务可以读取到修改事务还未提交的数据。这就是“脏数据”。
    在这里插入图片描述

  • 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。意思是:事务A查询了表C,此时事务A还未提交,这时事物B对表C进行了修改操作并且提交了事物。当修改后,事务A又查询了一次表C,这时候在同一个事务A中的两次查询结果就不一样了

  • 丢失修改:事物1和事物2都要修改A数据(假设A数据为20),因为他们从表中读取到的A数据都是20,事物1和事物2都进行了-1操作,所以当两个事物都修改结束后A数据还为19;但是我们所期望的A数据应该是18。
    在这里插入图片描述

  • 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。

10.4.2 隔离级别
  1. read uncommitted:读未提交
    1. 产生的问题:脏读、不可重复读、幻读
  2. read committed:读已提交(Oracle默认)
    1. 产生的问题:不可重复读、幻读
  3. repeatable read:可重复读(MySQL默认)
    1. 产生的问题:幻读
  4. serializable:串行化
    1. 可以解决所有的问题

设置隔离级别:隔离级别其实就是用过锁机制实现的,数据库给用户提供了隔离级别从小到大安全性越来越高,但是效率越来越低

  • select @@tx_isolation;:数据库查询隔离级别
  • set global transaction isolation level 级别字符串; :数据库设置隔离级别

九、约束

什么是索引?

索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

MySQL在查询方面主要就是两种方式,全表扫描、根据索引检索

9.1 什么条件会考虑给字段添加索引呢?

  1. 数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
  2. 该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
  3. 该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。

9.2 索引的分类

单一索引:一个字段上添加索引。

复合索引:两个字段或者更多的字段上添加索引。

主键索引:主键上添加索引。

唯一性索引:具有unique约束的字段上添加索引。

在MySQL当中,主键上,以及unique字段上都会自动添加索引的!!!!

9.3 创建索引

  • create index 索引名 on emp(字段);:创建索引

  • drop index 索引名 on emp;:删除索引

  • explain select * from emp where ename = 'KING';:查看select语句是否有用到索引

9.4 索引的失效

  1. 使用左模糊查询
  2. 使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引才会走索引检索。如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效,所以这就是为什么不建议使用or的原因。
  3. 在where当中索引列参加了运算,索引失效。
  4. 在where当中索引列使用了函数

十、DCL:数据库管理员

create user ‘用户名’@‘主机名’ identified by ‘密码’;:添加用户

drop user ‘用户名’@‘主机名’;:删除用户

update user set password = password(‘新密码’)where user =‘用户名’;:修改用户密码方式一

set password for ‘用户名’@‘主机名’=password(‘新密码’);:修改用户密码方式二

10.1 mysql中忘记了root用户的密码

#需要管理员身份运行cmd
net stop mysql #停止mysql服务,
mysqld - -skip-grant -tables #使用无验证方式启动mysql服务

#打开新的cmd窗口,直接输入mysql命令,回车,就可以登入成功
use mysql;

update user set password=password(‘你的新密码’) where user=‘root’;
#打开任务管理器,手动结束mysqld.exe的进程
#启动mysql服务
#使用新密码登入。

10.2 查询用户

use mysql;:切换到mysql数据库

select*from user;:查询user表

通配符:%表示可以在任意主机使用用户登入数据库

10.3 权限管理

show grants for ‘用户名’@‘主机名’;:查询权限

grant 权限列表 on 数据库名.表名 to ‘用户名’@‘主机名’;:授于权限

grant all on *.* to ‘用户名’@‘主机名’;:赋予超级权限

revoke 权限列表 on 数据库.表名 from ‘用户名’@‘主机名’;:撤销权限

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LinTianhong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值