MySQL.md
文章目录
第一章-MySQL概述
5.7版本下载地址https://dev.mysql.com/downloads/file/?id=494047 免安装版本教程(win10缺少组件):https://blog.csdn.net/juncailiao/article/details/82706155
U盘中的安装教程https://blog.csdn.net/weixin_44051608/article/details/85163823 mysql本机密码:root 123456
1数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
1.1数值类型
类型 | 大小 | 范围(有符号) | 用途 |
---|---|---|---|
TINYINT | 1 字节 | (-128,127) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | 大整数值 |
BIGINT | 8 字节 | 极大整数值 | |
FLOAT | 4 字节 | 单精度 浮点数值 | |
DOUBLE | 8 字节 | 双精度 浮点数值 | |
DECIMAL | 对DECIMAL(M,D) , 如果M>D,为M+2否则为D+2 |
依赖于M和D的值 | 小数值 |
1.2日期和时间类型
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒, 北京时间 2038-1-19 11:14:07, |
YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
1.3字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
1.4常见错误
date datetime int float double varchar char TIMESTAMP列必须有默认值 ps.setNull(3,java.sql.Types.Null); 当设置null时候,TIMESTAMP列是当前时间 DATETIME列可以设置为多个,默认可为null
连接超时
当ssm项目使用c3p0连接池。昨天访问还可以,今天访问就报以下错误。
1 2 3 4 5 6
The last packet successfully received from the server was58129 seconds ago. The last packet sent successfully to the server was 58129 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
如果连接闲置8小时 (8小时内没有进行数据库操作), mysql就会自动断开连接。而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。
1 2 3 4
<!--最大空闲时间,3600秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0 --> <property name="maxIdleTime" value="7200"/> <!--每1800秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="1800"/>
mysql请求包过大
Packet for query is too large (2,486 > 1,024)使用mysql5.6数据库进行查询时,请求包过大。
解决:windos是my.ini文件或者my.cnf(Linux下的/etc/my.cnf) ,在[mysqld]下把max_allowed_packet设置稍大一些即可。重启mysql服务。
1 2 3 4
[client] max_allowed_packet=10240 [mysqld] max_allowed_packet=10240
验证:LInux下进入Mysql,show VARIABLES like ‘%max_allowed_packet%';
2快速入门
2.1Navicat创建数据库
创建数据库 字符集填写utf8 – UTF-8 Unicode 排序规则填写utf8_general_ci
2.2连接数据库注意
UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。
//北京时间==东八区时间!=北京当地时间 serverTimezone=GMT%2B8 //或者使用上海时间 serverTimezone=Asia/Shanghai
所以:设置时区serverTimezone=GMT%2b8 %2b是+号
|
|
3常见SQL
日期
查询指定日志,方式一
|
|
查询指定日期,方式二
|
|
|
|
日期函数
1 获取当前日期,CURDATE() 格式:2020-07-20
2 获取特定日期,DATE_SUB(CURDATE(), INTERVAL 7 DAY)
- INTERVAL 7 DAY 获取间隔7天的日期(7天前),若是7天后-7
- DATE_SUB() 返回日期 前一个日期减去后一个日期。
索引添加
1.添加PRIMARY KEY(主键索引):
ALTER TABLE table_name
ADD PRIMARY KEY ( column
)
2.添加UNIQUE(唯一索引) :
ALTER TABLE table_name
ADD UNIQUE ( column
)
3.添加INDEX(普通索引) :
ALTER TABLE table_name
ADD INDEX index_name ( column
)
4.添加FULLTEXT(全文索引) :(几乎不用)
ALTER TABLE table_name
ADD FULLTEXT ( column
)
5.添加多列索引:
ALTER TABLE table_name
ADD INDEX index_name ( column1
, column2
, column3
)
增删改查
删
1 2 3 4
//删除重复语句 delete from zz_account1 where aid not in (select aid from (select aid from zz_account1 group by username,password) a1)
删除重复语句另一种解决
先建立一个同样字段的新表newtable,给指定data字段设置好unique约束 使用如下sql语句将旧表的数据全部INSERT转移到新表,由于使用了IGNORE选项这样遇到重复数据会忽略,直到将所有数据插入完成 INSERT IGNORE INTO newtable SELECT * FROM oldtable;
第二章-执行引擎
存储引擎是作用在表上的,创建表的时候可以指定存储引擎。
show engines;可以查询当前数据库支持的引擎以及主要特点,
1、MyISAM
有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。
2InnoDB
InnoDB是默认的数据库存储引擎,他的主要特点有:
(1)可以通过自动增长列,方法是auto_increment。
(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,可以支持更高的并发;
(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
(5)配合一些热备工具可以支持在线热备份;
(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
当然InnoDB的存储表和索引也有下面两种形式:
(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。
(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。
对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。
文章作者 卢森林
上次更新 2020-07-23