本博文源于韩顺平老师java学习,包括mysql安装和配置,数据库、表、mysql数据类型、cruc、函数、内连接、外连接、约束索引事务等。内容笔记算是完整
1.MySQL安装和配置
2. 数据库
2.1 SQL语句分类
- DDL;数据定义语句
- DML:数据操作语句
- DQL:数据查询语句
- DCL:数据控制语句
2.2 创建数据库
- CHARACTER SET:指定数据库采用的字符集,如果不指定字符集,默认utf-8,
- COLLATE:指定数据库字符集的1校对规则(常用的utf8-bin)不区分大小写1,utf8-general_ci不区分大小写注意默认是utf8_general_ci
2.3 备份恢复数据库
- 备份数据库
mysqldump -u 用户名 -p -B 数据库1 数据库2 > 文件名.sql - 恢复数据库
Source 文件名.sql
3. 表
4.Mysql数据类型
4.1 数值型基本使用
- FLOAT/DOUBLE 单精度与双精度
- DECIMAL[M,D] 可以支持更加精确的小数位。M是小数位数(精度)的总数,D是小数点,后面的位数。如果d是0,则值没有小数点或分数部分,M最大65,d最大是30,如果D被省略,默认是0,如果M被省略,默认是10
use hsp_db01;
create table t06(num1 float,num2 double,num3 decimal(30,20));
insert into t06 values(88.12345678912345,88.12345678913245,88.12345678912345);
select * from t06;
4.2 字符串基本使用
char(size):固定长度字符串,最大255字符
varchar(size)可变长度字符串,最大65532字节(utf8编码最大21844字符 1-3个字节记录大小)
4.3 字符串使用细节
4.3.1 细节1
char(4) 这个4表示字符数(最大255),不是字节数,不管是中文还是字母都是放四个,按字符计算
varchar(4)这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据。
不管是中文还是英文字母,都是最多存放4个,是按照字符来存放的
4.3.2 细节2
char(4)是定长(固定1的大小),就是说,即使你,插入“aa”,也会占用分配的4个字符的空间
varchar(4)是变长的大小,就是说,如果你插入了"aa",实际占用空间大小并不是4个字符,而是按照实际占用空间来分配
4.3.3 细节3
如果数据是定长,推荐使用cha,比如md5的密码,邮编,手机号,身份证号码等
如果一个字段的长度是不确定,我们使用varchar,比如留言、文章
4.3.4 细节4
在存放文本时,也可以使用Text数据类型,可以将Text列视为VARCHAR列,注意Text不能有默认值,大小0-2^16字节,如果希望存放更多1字符,可以选择MEDIUMTEXT 0-2的24 或者LONGTEXT 0-2的32
4.4 日期类型基本使用
日期类型基本使用
- date
- datetime
- timestamp
日期类型细节说明
4.5 修改表
添加列
- alter table tablename add column datatype
修改列
- alter table tablename modify column datatype
删除列
- alter table tablename dtop column
5.CRUC
5.1 插入表细节
- 插入的数据应与字段的数据类型相同
- 数据的长度应在列1的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中
- 在values中列出的数据位置必须与被加入的列的排列位置相对应
- 字符和日期类型数据应包含在单引号中
- 列可以插入空值,前提是该字段允许为空
- insert into tab_name(列名…) values (),(),() 形式添加多条记录
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
- 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错,如果我们希望指定某个列的默认值,可以在创建表时指定
5.2 更新语句细节
- UPDATE语法可以用新值更新原有表行中的各列
- SET子句指示要修改哪些列和要给予哪些值
- where子句指定应更新哪些行,如没有where子句,则更新所有的行记录
- 如果要修改多个字段,可以通过 set 字段1=值1,字段2=值2
5.3 delete语句细节
- 如果不使用where子句,将删除表中所有数据
- DELETE语句不能删除某一列的值(可使用update设为null或者’')
- 使用delete语句仅仅删除记录,不删除表本身,如要删除表,使用drop table ,drop table 表名.
5.4 select语句
5.4.1 使用order by子句排序查询结果
select column1 from table order by column
- order by指定排序的列,排序的列既可以是表中的列名1,也可以是select语句后1指定的列名
- asc升序(默认),desc 降序
- order by 子句应位于select语句的结尾.
6. 函数
6.1 字符串相关函数
函数 | 含义 |
---|---|
charset(str) | 返回字串字符集 |
concat(string2 [,…]) | 连接字串 |
INSTR(string,substring) | 返回substring在string中出现的位置,没有返回0 |
UCASE(string2) | 转换成大写 |
LCASE(string2) | 转换成小写 |
LEFT(string2,length) | 从string2中的左边起取length个字符 |
LENGTH(string) | string长度 |
REPLACE(str,search_str,replace_str) | 从str中用replace_str替换search_str |
STRCMP(string1,string2) | 逐字符比较两字串大小 |
SUBSTRING(str,position[,length]) | 从str的position开始,取length长度个字符 |
LTRIM(string2) RTRIM(string2) trim | 去除前端空格或后端空格 |
6.2 数学相关函数
函数名 | 含义 |
---|---|
abs(num) | 绝对值 |
bin(decimal_number) | 十进制转二进制 |
ceukubg(number) | 向上取整,得到比num2大的最小整数 |
CONV(number2,from_base,to_base) | 进制转换 |
FLOOR(number) | 向下取整,得到比num2小的最大整数 |
format(number,decimal_places) | 保留小数位数 |
hex(decimalNumber) | 转十六进制 |
LEAST(number,number2) | 求最小值 |
MOD(numerator,denominator) | 求余 |
rand(seed) | rand[0到1之间 |
6.3 时间日期相关函数
函数名 | 含义 |
---|---|
CURRENT_date() | 当前日期 |
CURRENT_TIME() | 当前时间 |
current_timestamp() | 当前时间戳 |
date(datetime) | 返回datetime的日期部分 |
date_add(date,interval d_value d_type) | 在data2中加上日期或时间 |
date_sub(date2,interval d_value d_type) | 在data2上减去一个时间 |
datediff(date1,date2) | 两个日期差(结果是天) |
timediff(date1,date2) | 两个时间差(多少小时1多少分钟多少秒) |
now() | 当前时间 |
year | month |
6.4 加密和系统函数
函数名 | 含义 |
---|---|
user() | 查询用户 |
database() | 数据库名称 |
md5(str) | 为字符串算出一个md5 32的字符串 |
password(str) | 从原文密码str计算并返回密码字符串。 |
6.5 mysql语句加强
- 按雇员的id号升序取出,每页显示3条记录,请分别显示第1页,第2页,第3页。
- 基本语法: select … limit start,rows 表示从start+1 行开始取,取出rows行,start从0开始计算
- 公式: select * from emp order by empno limit 每页显示记录数* (第几页-1) ,每页显示记录数.
7. 内连接
8. 外连接
外连接就是没有记录显示为空用的
9.约束
9.1 check
- 用于强制行数据必须满足的条件,假定在sal列上定义了check的约束,并要求sal列值在1000-2000之间如果不再1000-2000之间就会提示出错。
9.2 自增长
- 一般来说自增长是和primary key配合使用的
- 自增长也可以单独使用(但是需要配合一个unique)
- 自增长修饰的字段为整数型的
- 自增长默认从1开始,你也可以通过如下命令修改alter
10.索引
10.1 索引类型
- 主键索引,主键自动为主索引
- 唯一索引
- 普通索引
- 全文索引
10.2 索引细节
- 较频繁的作为查询条件字段应该创建索引
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
- 更新非常频繁的字段不适合创建索引
- 不会出现在where子句中字段不该创建索引
11.事务
事务用于保证数据一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败,如:转账。
- start transaction --开始一个事务
- savepoint 保存点名,设置保存点
- rollback to 保存点名,回退事务
- rollback 回退全部事务
- commit 提交事务,所有操作生效,不能回退
11.1 事务管理
11.1.1 回退事务与提交事务
- 在介绍回退事务前,先介绍一个保存点,保存点是事物中的点。用于取消部分事务,当结束事务时,会自动删除该事务所定义的所有保存点,当执行回退事务时,通过指定保存点可以回退到指定的点
- 使用commit语句可以提交事务,当执行了commit语句子后,会确认事务的变化,结束事务,删除保存点,释放锁,数据生效。当使用commit语句结束事务子后,其他会话将可以查看到事务变化1后的新数据
11.1.2 事务细节
- 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
- 如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到你事务开始的状态。
- 你也可以在这个事务中,创建多个保存点.
- 你可以在事务没有提交前,选择回退到哪个保存点。
- mysql的事务机制需要innodb的存储引擎还可以使用myisam不好使
- 开始一个事务start transaction,set autocommit=off
11.2 savepoint
11.3 rollback
11.4 commit
11.5 隔离级别
11.5.1 简要介绍
- 脏读:当一个事务读取另一个事务尚未提交的修改时,产生脏读。
- 不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
- 幻读:同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时产生幻读。
11.5.2 隔离级别种类
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交 | V | V | V | 不加锁 |
读已提交 | x | V | V | 不加锁 |
可重复读 | x | x | x | 不加锁 |
可串行化 | x | x | x | 加锁 |
11.5.3 设置查看隔离级别
- 查看当前会话隔离级别
select @@tx_isolation;
- 查看系统当前隔离级别
select @@global.tx_isolation;
- 设置当前会话隔离级别
set session transaction isolation level repeatable read;
- 设置当前隔离级别
set global transaction isolation level repeatable read;
- mysql默认事务隔离级别是repeatble read,一般情况下,没有特殊要求,没有必要修改,因为级别可以满足1绝大部分项目需求
11.5.4 全局修改隔离级别
在my.ini配置文件,最后加上
transaction-isolation = REPEATABLE-READ
11.6 ACID
- 原子性:原子性是指事务是一个不可分割1的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性;事务必须使数据库从一个一致性状态转换到另外一个一致性状态。
- 隔离性;事务的隔离性是多个用户并访问数据库时i,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性;持久性是指一个事务一旦被提交,它对数据库中1数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其他有任何1影响。
12. 表类型和存储引擎
12.1 基本介绍
- MySQL的表类型由存储引擎决定,主要包括MYISAM、innoDB、Memory等
- MySQL数据表主要支持六种类型,分别是CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoBDB
- 这六种又分为两类,一类是“事务安全型”,比如innoDB;其余都属于第二类,称为非事务安全型
12.2 三种存储引擎介绍
- MyISAM不支持事务,也不支持外键,但其访问速度快,对事务完整性没有要求
- InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnodB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
- MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中并且默认使用HASH索引。但是一旦MySQL服务关闭,表中数据就会丢失掉,表的结构还在。
12.3 修改存储引擎
alter table 表名 engine = innodb;
13.视图
13.1 视图应用场景
不同人对数据表有不同的权限。
13.2 视图细节
- 创建视图后,到数据库去看,对应视图只有一个视图结构文件
- 视图的数据变化会影响到基表,基表1的数据变化也会影响到视图
- 视图可以再使用视图。数据仍然来自视图
13.3 视图的基本使用
create view
视图名as select
语句alter view
视图名as select
语句show create view
视图名drop view
视图名1,视图名2
13.4 视图最佳实践
- 安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
- 性能。关系数据库的数据常常会分表存储,使用外键建立这些表之间关系。这时,数据库查询通常会用到的连接。这样做不但麻烦,效率相对也比较低,如果建立一个视图1,将相关的表和字段组合在一起,就可以避免使用join查询数据。
- 灵活。如果系统中有一张旧的表,这张表由于1设计的问题1,即将被废弃。然而,很多应用1都是基于这张表,不易修改。这是就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可少做很多1改动,也达到了升级数据表的目的。
13.2 视图的总结
- 视图是根据基表来创建的,视图是虚拟的表
- 视图也有列,数据来自基表
- 通过视图可以修改基表的数据
- 基表的改变,也会影响到视图的数据。
14 mysql用户
14.1 授权用户
grant select on ....
grant select,delete,create on...
grant all on...
特别说明
*.* 代表 本系统 中的所有数据库的所有对象(表,视图,存储过程)
库.*:表示某个数据库中的所有数据对象(表,视图,存储过程等)
3.identified by 可以省略,也可以写出
- 如果用户存在,就是修改用户密码
- 如果该用户不存在,就是创建用户
14.2 回收用户授权
revoke 权限列表 on 库.对象名 from 用户名@登录位置
14.3 权限生效指令
如果权限没有生效,可以执行下面指令:
FLUSH PRIVILEGES;
14.4 细节说明
- 在创建用户的时候,如果不指定Host,则为%,%表示所有IP都有连接权限
create user xxx;
- 你也可以这样指定
create user 'xxx'@'192.168.1.%'
表示xxx用户在192.168.1.*的ip可以登陆mysql - 在删除用户的时候,如果host不是%,需要明确指定’用户’@‘host值’