MySQL笔记
文章目录
- MySQL的三层结构
- SQL语句分类
- sql语句
- 数据库操作
- 创建数据库
- 查看、删除数据库
- 表操作
- 创建表
- mysql常用数据类型(列类型)
- 查询表、插入值
- 创建表练习
- 创建一个员工表emp
- 修改表
- mysql约束
- primary key(主键)
- not null(非空)
- unique(唯一)
- foreign key(外键)
- check
- 自增长
- 索引
- 索引的代价
- 索引原理
- 哪些列上适合使用索引
- 主键索引
- 唯一索引(UNIQUE)
- 普通索引(INDEX)
- 全文索引(FULLTEXT)[适用于MylSAM]
- 索引使用
- 事务
- 引出事务
- 基本操作
- 事务细节
- 事务隔离级别
- 查看和设置事务隔离级别
- 全局修改事务隔离级别
- 事务的acid特性
- 数据库CRUD语句
- 单表查询
- 表达式与as语句
- 运算符
- 排序
- 使用group by子句对列进行分组
- 使用having子句对分组后的结果进行过滤
- 关键字
- DISTINCT 去重
- 函数
- 统计函数
- 统计 - count
- 求和函数 - sum
- 平均值 - avg
- 最大值 max
- 最小值 min
- 字符串函数
- 数学函数
- 时间日期函数
- 加密和系统函数
- 流程控制函数
- 单表查询加强
- 分页查询
- 多表查询
- 笛卡尔集
- 自连接
- 子查询
- 单行子查询
- 多行子查询
- 多行子查询中使用all与any操作符
- 多列子查询
- 子查询临时表
- 表复制与去重
- 合并查询union,union all
- 外连接
- 存储引擎
- 基本介绍
- 主要的存储引擎/表类型特点
- 如何选择表的存储引擎
- 视图
- 基础概念
- 视图的基本使用
- 视图中可以在使用视图
- 视图最佳实践
- 用户管理
- 创建、删除用户
- 用户修改密码
- mysql中的权限
- 给用户授权
- 回收用户权限
- 权限生效指令
- mysql命令
- 备份数据库
- 备份库的表
- 恢复数据库
MySQL的三层结构
SQL语句分类
DDL:数据定义语句[create表,库…]
DML:数据操作语句[增加insert,修改update,删除delete]
DQL:数据查询语句[select]
DCL:数据控制语句[管理数据库:比如用户权限grant revoke]
TCL:不是王牌电视。是事务控制语言包括:事务提交:commit;事务回滚:rollback;
sql语句
数据库操作
创建数据库
在创建数据库,表的时候,为了规避关键字,可以使用反引号解决
CREATE DATABASE `CREATE`
#创建一个名称为hsp_db01的数据库
CREATE DATABASE hsp_db01;
#创建一个utf8字符集的hsp_db02数据库
CREATE DATABASE hsp_db02 CHARACTER SET utf8;
#创建一个使用utf8字符集,并带校对规则的hsp_db03数据库
CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin;
查看、删除数据库
#显示数据库
SHOW DATABASES;
#显示数据库创建语句
SHOW CREATE DATABASE db_name;
#数据库删除语句
DROP DATABASE [IF EXISTS] db_name;
表操作
创建表
mysql常用数据类型(列类型)
枚举类型
字符串使用细节
char(4) //这个4表示字符数(最大255),不是字节数,不管是中文还是字母都
是放四个,按字符计算.varchar(4) //这个4表示字符数,不管是字母还是中文都以定义好的表的编码
来存放数据
不管是中文还是英文字母,都是最多存放4个,是按照字符来存放的,char(4)和 varchar(4)这个4表示的是字符,而不是字节,不区分字符是汉字还是字母
什么时候使用char,什么时候使用varchar
1.如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号码等.char(32)
2.如果一个字段的长度是不确定,我们使用varchar,比如留言,文章
查询速度:char > varchar在存放文本时,也可以使用Text数据类型.可以将TEXT列视为 VARCHAR列,注意Tet不能有默认值.大小0-216字节如果希望存放更多字,可以选择 MEDIUMTEXT 0-2^24或者LONGTEXT 0~2^32
查询表、插入值
# 查询所有从t1表条件是name=tom
SELECT * FROM t1 WHERE NAME = 'tom';
# 给t3表添加一个值
INSERT INTO t3 VALUES(127);
# 显示表的结构和约束
desc 表名
创建表练习
创建一个员工表emp
修改表
mysql约束
primary key(主键)
primary key不能重复而且不能为null
一张表最多只能有一个主键,但可以是复合主键(比如id+name)
复合主键
id+name同时相同才不允许添加
not null(非空)
unique(唯一)
foreign key(外键)
1.外键指向的表的字段,要求是primary key或者是 unique
2.表的类型是innodb,这样的表才支持外键
3.外键字段的类型要和主键字段的类型一致(长度可以不同)
4.外键字段的值,必须在主键字段中出现过,或者为null[前提是外键字段允许为null]
5.一旦建立主外键的关系,数据不能随意删除了
外键示意图
check
MySQL从8.0.16版本开始支持CHECK约束,并使其生效。在MySQL 8.0.16之前的版本中,虽然允许使用CHECK (expr)形式的检查约束语法,但实际上解析之后会忽略该子句,CHECK约束并不会对数据进行检查,而是仅仅作为注释存在。
CHECK约束是一种完整性约束,用于限制表中数据的取值范围,可以确保插入或更新的数据满足特定的条件。它有助于维护数据的完整性,防止非法数据的插入或更新,并且通过在数据库层面进行数据验证,可以减少应用程序中的错误处理逻辑,提高性能。
在MySQL中,CHECK约束可以分为基于列的CHECK约束和基于表的CHECK约束。基于列的CHECK约束应用于单个列,限制该列的取值范围;而基于表的CHECK约束则应用于整个表,可以涉及多个列的组合条件。
因此,如果需要使用CHECK约束来限制MySQL表中数据的取值范围,请确保使用的MySQL版本为8.0.16或更高版本。
商店表设计
CREATE DATABASE shop_db;
-- 商品goods
CREATE TABLE goods (
goods_id INT PRIMARY KEY,
goods_name VARCHAR (64) NOT NULL DEFAULT '',
unitprice DECIMAL (10, 2) NOT NULL DEFAULT 0 CHECK (unitprice >= 1.0 AND unitprice <= 9999.99),
category INT NOT NULL DEFAULT 0,
provider VARCHAR (64) NOT NULL DEFAULT ''
);
-- 客户customer
CREATE TABLE customer (
-- 客户
customer_id VARCHAR (8) PRIMARY KEY,
-- 姓名
`name` VARCHAR (64) NOT NULL DEFAULT '',
-- 地址
address VARCHAR (64) NOT NULL DEFAULT '',
-- 邮箱
email VARCHAR (64) UNIQUE NOT NULL,
-- 性别
sex ENUM ('男', '女') NOT NULL,
-- 身份证
card_Id CHAR(18)
);
-- 购买
CREATE TABLE purchase (
-- 订单号
order_id INT UNSIGNED PRIMARY KEY,
-- 客户号
customer_id CHAR(8) NOT NULL DEFAULT '',
-- 商品号
goods_id INT NOT NULL DEFAULT 0,
-- 购买数量
nums INT NOT NULL DEFAULT 0,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);
自增长
1.一般来说自增长是和primary key配合使用的
2.自增长也可以单独使用[但是需要配合一个unique]
3.自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)
4.自增长默认从1开始,你也可以通过如下命令修改alter table 表名 auto increment = xxx;
5.如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准,如果指定了自增长,一般来说,就按照自增长的规则来添加数据
索引
说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍干倍。
索引的代价
1.磁盘占用
2.对dml(update delete insert)语句的效率影响(会对索引进行维护,对速度有影响)
索引原理
没有索引为什么会慢?因为全表扫描
使用索引为什么会快?形成一个索引的数据结构,比如二叉树
哪些列上适合使用索引
1.较频繁的作为查询条件字段应该创建索引
select from emp where empno 1
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select from emp where sex = ‘男’
3.更新非常频繁的字段不适合创建索引
select from emp where logincount = 1
4.不会出现在WHERE子句中字段不该创建索引
主键索引
主键自动的为主索引(类型Primary key)
唯一索引(UNIQUE)
如果某列的值,是不会重复的,则优先考虑使用unique索引,否则使用普通索引
普通索引(INDEX)
全文索引(FULLTEXT)[适用于MylSAM]
一般开发,不使用mysql自带的全文索引,而是使用:全文搜索Solr ElasticSearch (ES)
索引使用
查询表是否有索引
添加、删除索引
事务
什么是事务
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dl语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。事务和锁
当执行事务操作时(dml语句),mysql:会在表上加锁,防止其它用户改表的数据.这对用户来讲是非常重要的
引出事务
基本操作
回退事务
在介绍回退事务前,先介绍一下保存点(savepoint).保存点是事务中的点.用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点.当执行回退事务时,通过指定保存点可以回退到指定的点。提交事务
使用commiti语句可以提交事务.当执行了commiti语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话【其他连接】将可以查看到事务变化后的新数据【所有数据就正式生效】
事务细节
1.如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
2.如果开始一个事务,你没有创建保存点.你可以执行rollback,默认就是回退到你事务开始的状态
3.你也可以在这个事务中(还没有提交时),创建多个保存点.
比如:
savepoint aaa;
执行dml
savepoint bbb;
4.你可以在事务没有提交前,选择回退到哪个保存点
5.mysql的事务机制需要lnnoDB的存储引擎才可以使用,MyISAM不支持
6.开始一个事务start transaction 或者 SET autocommit=off;
事务隔离级别
事务隔离级别介绍
1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)
2.如果不考虑隔离性,可能会引发如下问题:
脏读
不可重复读
幻读
查看和设置事务隔离级别
全局修改事务隔离级别
事务的acid特性
数据库CRUD语句
1.如果不使用where子句,将删除表中所有数据。
2.Delete语句不能删除某一列的值(可使用update设为null或者")
3.使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。drop table 表名;
单表查询
表达式与as语句
运算符
排序
使用group by子句对列进行分组
使用having子句对分组后的结果进行过滤
关键字
DISTINCT 去重
函数
统计函数
统计 - count
count(*)和count(列)的区别
*解释:count(*)返回满足条件的记录的行数
count(列):统计满足条件的某列有多少个,但是会排除为null的情况
求和函数 - sum
■统计一个班级数学总成绩?
■统计一个班级语文、英语、数学各科的总成绩
■统计一个班级语文、英语、数学的成绩总和
■统计一个班级语文成绩平均分
注意:sum仅对数值起作用,否则没有意义。
注意:对多列求和,“,”号不能少。
平均值 - avg
最大值 max
最小值 min
字符串函数
数学函数
rand()返回一个随机浮点值y,范围在0到1之间(即,其范围为0≤V≤1.0)。若已指定一个整数参数W,则它被用作种子值,用来产生重复序列。
1.如果使用rand()每次返回不同的随机数,在0≤v≤1.0
2.如果使用 rand(seed)返回随机数,范围0≤v≤1.0,如果seed不变,该随机数也不变了
时间日期函数
加密和系统函数
流程控制函数
单表查询加强
分页查询
多表查询
笛卡尔集
自连接
自连接是指在同一张表的连接查询
子查询
单行子查询
多行子查询
多行子查询中使用all与any操作符
多列子查询
请思考如何查询与allen的部门和岗位完全相同的所有雇员(并且不含allen本人)
(字段1,字段2…)=(select 字段1,字段2 from…)
子查询临时表
查询每个部门的信息(包括:部门名,编号,地址)和人员数量
表复制与去重
合并查询union,union all
外连接
1.左外连接(如果左侧的表完全显示我们就说是左外连接)
2.右外连接(如果右侧的表完全显示我们就说是右外连接)
存储引擎
基本介绍
InnoDB存储引擎:支持事务、行级锁定和外键
MRG_MYISAM存储引擎:收集相同的MyISAM表
MEMORY存储引擎:基于哈希的,存储在内存中,对临时表有用
BLACKHOLE存储引擎:写入到这的数据会被销毁
MYISAM存储引擎:不支持事务
CSV存储引擎:CSV存储引擎
ARCHIME存储引擎:存档类型的存储引擎
显示当前数据库支持的存储引擎
show engines;
主要的存储引擎/表类型特点
1.MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求
2.InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起
MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留
数据和索引。3.MEMORY?存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应
一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,
并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还
在。
如何选择表的存储引擎
修改存储引擎
-- 指令修改存储引擎
ALTER TABLE `t29` ENGINE = INNODB;
视图
看一个需求
基础概念
1.视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)
2.视图和基表关系的示意图
对视图的总结
1.视图是根据基表来创建的视图是虚拟的表
2.视图也有列,数据来自基表
3.通过视图可以修改基表的数据
4.基表的改变,也会影响到视图的数据
视图的基本使用
- create view 视图名 as select 语句
创建视图
- alter view 视图名 as select 语句
修改视图结构
- SHOW CREATE VIEW 视图名
查看创建视图的指令
- drop view 视图名1,视图名2
删除视图
视图中可以在使用视图
视图最佳实践
用户管理
原因:当我们做项目开发时,可以根据不同的开发人员,赋给他相应的mysql操作权限所以,mysql数据库管理人员(root),根据需要创建不同的用户,赋给相应的权限,供人员使用
不同的数据库用户,登录到DBMS后,根据相应的权限,可以操作的数据库和数据对象(表,视图,触发器)都不一样
user表的重要字段说明:
创建、删除用户
1.在创建用户的时候,如果不指定Host,则为%,%表示表示所有IP都有连接权限
create user xxx;
2.你也可以这样指定
create user’xx’@‘192.168.1.%‘表示Xxx用户在192.168.1.*的ip可以登
录mysql
3.在删除用户的时候,如果host不是%,需要明确指定"用户’@‘host值
DROP USER jack; – 默认就是DROP USER ‘jack’@’%’
用户修改密码
mysql中的权限
给用户授权
回收用户权限
权限生效指令
FLUSH PRIVILEGES;
mysql命令
备份数据库
要在Dos下执行mysqldump指令其实在mysql安装目录\bin
mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > d:\\文件名.sql
备份库的表
mysqldump -u 用户名 -p 数据库 表1 表2 表n > d:\\文件名.sql
恢复数据库
进入Mysql命令行再执行
source 文件名.sql