MySQL基础知识点


where和having的区别?

where是在分组之前进行限定,若不满足where条件则不参与分组,having是在分组之后进行限定

where后面不能跟聚合函数,而having后面能跟聚合函数

分页查询

分页查询公式——开始索引=(当前页码 - 1)* 每页记录数量 limit (开始索引,页记录数)

约束

添加/删除非空约束

alter table 表名 modify 字段名 约束

删除唯一约束

alter table 表名 drop index 字段名

添加唯一约束

alter table 表名 modify 字段名 约束

添加外键 add constraint 约束名称 foreign key (外键字段名)references 外表名(外表字段名)

级联操作

在设置外键约束时进行级联设置constraint 约束名称 foreign key (外键字段名)references 外表名(外表字段名)on (delete/update) cascade

1 级联更新 on update cascade

2 级联删除 on delete cascade (谨慎操作,影响性能和危险操作)

多表之间关系

一对一

对于两张表是一对一的关系,只需要对其中一张表设置一个唯一的外键指向另一张表,或者直接将两张表合为一张表

一对多(多对一)

需要在“多”的一方添加外键指向“一”,这个外键是另一张表的主键

多对多

多对多关系中,需要一个中间表来作为缓冲,这个中间表至少包含另外两张表的主键作为中间表的外键,同时应当注意中间表中的两个外键不能有相同的记录,否则没有意义

三大范式(数据库的设计原则)

1NF: 每一列都是不可分割的原子列

2NF: 在第一范式的基础上,消除部分函数依赖

3NF: 在第二范式的基础上,消除传递函数依赖

数据库的备份和还原

命令行方式

备份:mysqldump -u -p 数据库名称 > 保存路径

还原:1创建数据库——2 source 路径

图形化界面

备份:

还原:

多表查询

内连接查询:{

​ 隐式内连接:{

​ select * from table1 t1, table2 t2 where … ;

​ }

​ 显示内连接查询 {

​ select * from table1 inner join on table2

​ select * from table1 join on table2

​ }

}

外连接查询:{

​ 左外连接 select * from table1 left join on table2 {查询table1的所有及其交集}

​ 右外连接 select * from table1 right join on table2 {查询table2的所有及其交集}

}

子查询: {

​ 子查询结果是单行单列

​ 子查询结果是多行单列

​ 子查询结果是多行多列

}

事务

基本概念

命令

开启事务:start transaction

事务回滚:rollback

事务提交:commit {

​ 手动提交<——>自动提交(查询提交方式select @@autocommit; 修改提交方式set @@autocommit)

}

{查看数据库隔离级别select @@tx_isolation;修改数据库隔离级别set global transaction isolation level 隔离级别字符串}

事务四大特性:

原子性

持久性

隔离性

一致性

事务的隔离级别:

1 read uncommitted 读未提交(产生问题:脏读、不可重复读(虚读)、幻读)

2 read committed 读已提交 产生问题:虚读、幻读 (oracle默认级别)

3 repeatable read 可重复读 产生问题:幻读 (MySQL默认级别)

1
2
3
提问:为什么上了写锁(写操作),别的事务还可以读操作?

因为InnoDB有MVCC机制(多版本并发控制),可以使用快照读,而不会被阻塞。

4 serializable 串行化 解决所有问题

DCL
用户管理

在mysql数据库中的user表

增:CREATE USER ‘用户名‘@’主机名’ IDENTIFIED BY ‘密码’;

删:DROP USER ‘用户名‘@’主机名’;

改:

查:1、切换到mysql数据库 use mysql,2、查询user表 SELECT * FROM USER; % 表示通配符,通配任意主机

忘记root用户的密码了应该怎么办?

1、用管理员运行cmd——>net stop mysql 停止mysql服务

2、用无验证方式启动mysql服务: mysqld –skip-grant-tables

3、打开新的cmd窗口,直接输入mysql命令,回车。即登录成功

4、use mysql;

5、update user set password = password(‘root’) where user = ‘root’

6、关闭两个窗口

7、打开任务管理器,手动结束mysqld.exe进程

8、用管理员cmd启动mysql服务

9、使用新密码登录

用户授权

查询权限

1
SHOW GRANTS FOR '用户名'@'主机名';

授予权限

1
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'

授予全部权限(通配):

1
GRANT ALL ON *.* TO '用户名'@'主机名'

撤销权限

1
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';