导图社区 MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一。本思维导图是作者自己的MySQL学习经验总结,希望对你有帮助!
编辑于2019-12-05 08:09:09MySQL
约束
非空约束:not null 值不能为空
创建
删除
ALTER TABLE 表名 MODIFY 列名;
创建表完后,添加非空约束
ALTER TABLE 表名 MODIFY 列名 NOT NULL;
唯一约束:unique 值不能重复
创建
删除
ALTER TABLE 表名 DROP INDEX 列名;
在创建表后,添加唯一约束
ALTER TABLE 表名 MODIFY 表名 UNIQUE;
主键约束 primary key 非空且唯一
创建
删除
ALTER TABLE 表名 DROP PRIMARY KEY;
创建完主键后,添加主键
ALTER TABLE 表名 MODIFY id INT PRIMARY KEY;
自动增长
创建
auto_increment
删除自动增长
ALTER TABLE 表名 MODIFY 列名 INT;
添加自动增长
ALTER TABLE 表名 MODIFY 列名 INT AUTO_INCREMENT;
外键约束 foreign key 消除数据冗余
创建
constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列键名称)
删除
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
添加数据后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY 外键字段 REFERENCES 主表(主表列名称)
级联操作 CASCAD
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY 外键字段 REFERENCES 主表(主表列名称)ON UPDATE CASCADE ON DELETE CASCADE; 分类: 两个一直分开也可以一起使用 1、级联更新:ON UPDATE CASCADE 2、级联删除:ON DELETE CASCADE 弊端:和这条记录相关的数据都被删除了,很危险
范式
第一范式(1NF):每一列都是不可分割的原子数据项
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
1.函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A 例如:学号-->姓名 (学号,课程名称)
2.完全函数 依赖:A-->B 如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性 例如:(学号,课程名称) -->分数
3.部分函数 依赖 A-->B 如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中某一些值即可 例如:(学号,课程名称) -->姓名
4.传递函数依赖:A-->B,B-->C,,如果通过A属性(属性组)的值,可以确定唯一B属性的值,然后再通过B属性的值可以确定唯一C属性的值,则C传递函数依赖于A 例如:学号 -->系名 系名-->系主任
5.码:如果在一张表中一个属性或属性组,被其他所有属性所完全依赖则称这个属性(属性组)为该表的码 例如:该表中码为:(学号,课程名称) *主属性:码属性组中的所有属性 *非主属性:除过码属性组的属性
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
多表查询
查询步骤 1、从哪些表中查询数据 2、条件是什么 3、查询哪些字段
内连接查询
隐式内连接
使用where 条件
显式内连接
select 字段列表 from 表名1 inner join 表名2 on 条件 (inner)可以省略
外连接查询
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件
子查询
子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断。
子查询的结果是多选单列的
子查询可以作为条件,使用运算符in来判断
子查询的结果是多选多列的
子查询可以作为一张虚拟表参与查询
事务
操作
1.开启事务
start transaction;
2.回滚
rollback
3.提交
commit
事务提交的两种方式
自动提交
* 一条DML(增删改)语句会自动提交一次事务。
手动提交
需要先开启事务,再提交
修改事务的默认提交方式
查看事务的默认提交方式:SELECT @@autocommit; -- 1代表自动提交,0代表手动提交
修改默认提交方式:set @@autocommit
四大特征:笔试题中经常见到
1、原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
2、持久性:如果事务一旦提交或回滚后,数据库会持久化保存数据
3、隔离性:多个事务之间,相互影响。相互独立。
4、一致性:事务操作前后,数据问题不变
事务的隔离级别(了解)
隔离级别
注意:隔离级别从小到大安全性越来越高,但效率越大越低
1.read uncommitted:读未提交 *产生的问题:脏读 、虚读、幻读
2.read committed:读已提交 (oracle默认) *产生的问题:不可以重复,幻读
3.repeatable read:可重复 读 (mysql默认) *产生的问题:幻读
4.serializable :串行化 *可以解决所有的问题
*数据库调设置隔离级别 *select @@tx_isolation; *数据库设置隔离级别: *set global transaction isola tion level 级别字符串
JDBC
步骤
1.导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.复制 jar包到项目中的libs文件夹目录下 2.右键--> add as Libary 2.注册驱动 3.获取数据库连接对象 Connection 4.定义sql 5.获取执行sql语句的对象 statement 6.执行sql,接收返回结果 7.处理结果 8.释放资源
DCL
管理用户
添加用户
CREATE USER '用户名' @'主机名' IDENTIFIED BY '密码'
CREATE USER '用户名' @'%(任意主机)' IDENTIFIED BY '密码'
删除用户
DROP USER '用户名'@'主机名';
修改用户密码
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
查询用户
SELECT *FROM USER;
权限管理
查询权限
SHOW GRANTS FOR '用户名'@'主机名';
授予权限
GRANT 权限列表,权限列表 ON 数据库.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表,权限列表 ON 数名库.表名 FROM '用户名' @'主机名';
DQL
排序查询 order by
*order by 排序字段1 排序方式1,排序字段2 排序方式2
ASC正序
DESC倒序
聚合函数
count
max
min
sum
avg
查询 where
select 字段名1,字段名2。。。from表名,
去除重复
*select distinct 列名 from表名
ifnull
AS 起别名
条件查询
*BETWEEN。。。AND
*IN集合
*>、<、<=、>=、=、<>不等于(==)
*is null
*and 或&&
*or 或||
*not 或!
模糊查询
*占位符: * _:单个任意字符 *%:多个任意字符
分组查询 group by having
group by 分组字段;
where 和 having的区别?
1.where 在分组之前进行限定,如果不满足条件,不参与分组 Having是在分组之后进行限定,如果不满足,就不会被查询出来 2.where后不可跟聚合函数,having可以进行聚合函数的判断。
分布查询 limit
limit 开始的索引,每页查询的条数;
2.公式:开始的索引 = (当前的页码-1) *每页显示的条数 3.分布操作是一个"方言"
DML
添加数据
insert into 表名(列名1,列名2) values(值1,值2)
删除数据
delete from 表名 [where 条件]
删除所有数据
delete from 表名
truncate table 表名
修改数据
update 表名 set 列名1=值1,列名2=值2...[where 条件];
DDL
库操作
创建
create database if not exists 数据库名称;
查询
show create database 数据库名称;
* show databases;
查询当前
*select database();
修改
alter database 数据库名称 character set 字符集名称
删除
*drop database if exists 数据库名称;
使用
use 数据库名称
表操作
创建
复制表
create table 表名 like 被复制的表名
create table 表名( );
查看
show tables;
查看表结构
desc表名
修改
修改表名
alter table 表名 rename to 新表名
修改表字符集
alter table 表名 character set 字符集
添加一列
alter table表名 add 列名 列类型
修改列名称 类型
alter table 表名 change 列名 新列名 数据类型
alter table 表名 modify 列名数据类型
删除一列
alter table 表名 drop 列名
删除
drop table if exist 表名
mysql数据库支持的数据类型
数字
int 整型
float 浮点数
decimal 精确小数
字符
char 定长字符串
长度受限,短字符浪费空间,读写效率高
varchar 变长字符串
长度不限,短字符节省空间,读写效率低
时间和日期
year 年
date 年月日
time 时分秒
datetime 年月日时分秒
timestamp 年月日时分秒(2038年之前)
enum和set
enum()枚举单选
自动屏蔽不存在项
set()集合多选
多个重复赋值自动去重
Mysql
数据库相关概念
DB(数据库)
按照数据结构来组织、存储和管理数据的仓库
DBMS(数据库管理系统)
DBA(数据库管理员)
数据库的分类
关系型数据库
释义
关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1.数据以表格的形式出现 2.每行为各种记录名称 3.每列为记录名称所对应的数据域 4.许多的行和列组成一张表单 5.若干的表单组成database
表现形式
以表的形式存储
实例
oracle,access,sql server,MySQL
非关系型数据库
表现形式
以键值对:key-value方式存储
实例
mangoDB、redis、memcache
mysql数据库的引擎
数据库存储引擎:5.6版本之后的默认为InnoDB存储,5.5版本之前的默认是MyISAM存储引擎: 1.第一种myisam:三个文件 (1)表结构存文件、数据文件、搜索目录三个文件都存放在硬盘上 (2)应用于以读和插入为主的操作,很少的更新和删除 (2)不支持事务安全、不支持外键、不支持行级锁,表级锁严重影响并发 2.第二种innodb:两个文件 (1)表结构文件、数据和搜索目录文件都存放在硬盘上 (2)支持事务安全、支持外键、支持行级锁、表级锁 3.第三种memory:两个文件 (1)表结构存储在硬盘,数据存储在内存 (2)读写速度快,关机会导致内存数据的丢失,多用于热新闻 查看当前的默认存储引擎: mysql> show variables like "default_storage_engine"; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | +------------------------+--------+ 1 row in set (0.00 sec) 查询当前数据库支持的存储引擎: mysql> show engines \G;
InnoDB
5.6之后的版本默认,两个文件存储在硬盘:表结构和带有数据内容的索引;支持事务、行级锁、表级锁、支持外键
MyISAM
5.5及以前版本默认,三个文件存储在硬盘:表结构、索引目录、数据内容;不支持事务、不支持行级锁、表解锁降低并发效率、不支持外键
Memory
两个文件:表结构在硬盘,数据在内存,关机丢失,可用于热新闻等