重要概念介绍
"""
库 -----------------》 文件夹
表 -----------------》 文件
记录 -----------------》 文件内的一行行数据
例如:
id name hobby
1 tom read
2 jan play
3 lili 学习
表头:即为表格中的第一行字段。(id name hobby)
字段:id name hobby(字段名+字段类型)
表单:除表头以外,下面的数据
"""
基本SQL语句
库的增删改查
# 增
create database 数据库名;
eg:
create database db1;
create database db1 charset='utf-8'; # 指定库的字符编码
# 查
show databases; # 查看数据库列表
show create database db1; # 查看指定数据库
select database(); # 查看当前所在的库
# 改
alter database db1 charset='gbk'; # 修改库的编码格式
# 一般情况下库创建好之后不会修改
# 删除
drop database db1;
表的增删改查
**********前提:先选择数据库**********
1. 查看当前所在的库(也就是文件夹)
select database();
2. 选择数据库:
use db1; # 意味着打开db1文件夹
# 创建数据表(也就是文件)
create table t1 (id int, name varchar(16));
# 查看数据表
show tables;
show create table t1; # 查看表的详细结构
desc t1; # 查看表的详细信息
# 修改数据表
"""modify只能修改数据类型,change则可以修改更多的内容"""
alter table t1 modify name varchar(32);
alter table t1 change name name1 varchar(64);
# 删除数据表
drop table t1;
记录的增删改查
******************一定要先有库,再有表,才能对记录进行操作********************
# 1. 查看记录
select * from t1; # 查看所有,当数据量特别大的时候不建议使用
select id,name from t1; # 查询id、name字段的记录
# 2. 插入数据
insert into t1 (id, name) values (1, 'tom'); # 插入单条数据
insert into t1 (id, name) values (2, 'jan'), (3, 'lili'); # 批量插入数据
insert into t1 values (4);
insert into t1 (name) value ('jane');
# 3. 修改数据
update t1 set name = 'TOM' where id=1;
# 4. 删除数据
delete from t1 where id=1;
delete from t1; # 清空表
truncate t1; # 清空表
存储引擎
日常生活中文件格式有很多种,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt,PDF,Word,MP4…),针对不同的数据应该有对应的不同的处理机制来存储,而存储引擎就是不同的处理机制。存储引擎决定了存储数据的方式。
对于MySQL,支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
常用存储引擎及应用场景:
-
**InnoDB:**MySQL 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
-
**MyISAM:**MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
-
**Memory:**将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
存储引擎在MySQL中的使用:
# 查看所有的存储引擎
show engines;
# 查询当前数据库支持的存储引擎
show engines \G;
# 查看当前的默认存储引擎
show variables like "default_storage_engine";
'''各个存储引擎的存储文件'''
MyISAM的存储文件个数(3个):
1. .frm # 存储数据的表结构
2. .MYI # 存索引 >>> 类似于书的目录
3. .MYD # 存储表数据
InnoDB的存储文件个数(2个):
1. .frm # 存储表结构
2. .ibd # 存储数据和索引的
Memory的存储文件个数(1个):
1. .frm # 存储表结构的,(数据在内存,无需文件存储)
# 验证
create table t2 (id int) engine=MyISAM;
create table t3 (id int) engine=InnoDB;
create table t4 (id int) engine=MEMORY;
insert into t2(id) values(1);
insert into t3(id) values(2);
insert into t4(id) values(3);
数据类型
整型
主要包括TINYINT,SMALLINT,MEDUOMINT,INT,BIGINT,详细范围及用途见下表:
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8 字节 | (-9233372036854775808,9223372036 854775807) | (0,18446744073709 551 615) | 极大整数值 |
注意:整型的存储大小取决于类型,而不取决于括号里面的数字,而字符串的长度是取决于括号里面的数字。
示例:
create table t5 (id tinyint);
create table t5 (id int);
insert into t5 (id) values (-129), (128);
# 默认情况下是带符号的,如果超出范围,则存储范围内最大的数
浮点型
主要包括FLOAT、DOUBLE、DECIMAL,详细范围及用途见下表:
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
---|---|---|---|---|
FLOAT | 4 字节 float(255,30) | (-3.402823466 E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823 466351E+38) | 0,(1.175494351E-38,3.402823466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 字节 double(255,30) | (-1.7976931348623157E+308,-2.225 0738585072014E-308),0,(2.225073 8585072014E-308,1.797693134862 3157E+308) | 0,(2.225073858 5072014E-308,1.797693134862 3157E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 double(65,30) | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
示例:
"""
存储限制:
float(255, 30) # 代表总共255位,小数占30位
double(255, 30) # 代表总共255位,小数占30位
decimal(65, 30) # 代表总共65位,小数占30位
"""
create table t6 (id float(255, 30));
create table t7 (id double(255, 30));
create table t8 (id decimal(65, 30));
# 插入数据
insert into t6 values (1.11111111111111111111111);
insert into t7 values (1.11111111111111111111111);
insert into t8 values (1.11111111111111111111111);
结论:三者的精度不一样
decimal > double > float
字符串
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
注意:CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。CHAR列的长度固定为创建表是声明的长度,范围(0-255);而VARCHAR的值是可变长字符串范围(0-65535)。
示例:
"""
char(4) # 字符串类型,存储的范围是4个字符,超过了直接报错,不超过按照4个字符存
varchar(4) # 字符串类型,存储的范围是4个字符,超过了直接报错,不超过则有几个存几个
"""
# 创建表
create table t9 (id int, name char(4));
create table t10 (id int, name varchar(4));
# 插入数据
insert into t9 (id, name) values(1, 'kevin');
insert into t10 (id, name) values(1, 'kevin');
日期时间类型
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
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,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD\HHMMSS | 混合日期和时间值,时间戳 |
示例:
"""
datetime date time year
年月日,时分秒 年月日 时分秒 年份
"""
# 创建表
create table t11 (id int,
reg_time datetime,
reg1_time date,
reg2_time time,
reg3_time year
);
# 插入数据
insert into t11 values(1, '2022-1-1 11:11:11', '2022-01-02', '11:11:11', '2022');
枚举和集合类型
类型 | 大小 | 用途 |
---|---|---|
ENUM | 对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。 | 单选:选择性别 |
SET | 1-8个成员的集合,占1个字节 9-16个成员的集合,占2个字节 17-24个成员的集合,占3个字节 25-32个成员的集合,占4个字节 33-64个成员的集合,占8个字节 | 多选:兴趣爱好 |
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值。
SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。
示例:
# 枚举:多个里面选一个
create table t_one (id int,
gender enum('男', '女')
);
insert into t_two values (1, '男');
# 集合:多个里面选多个
create table t13 (id int,
hobby set('music', 'read', 'xj')
);
insert into t13 values (1, 'music');
严格模式和非严格模式
在MySQL中,什么是严格模式,简单说就是MySQL自身对数据的格式、长度、类型等做出了严格的校验,比如说字符串的长度定义为varchar(4),如果开启严格模式,当你存储的数据长度超过4,就会报错,如果没有开启,也就是非严格模式,则不会报错。在开发时,尽量开启严格模式,会减少项目上线后出现的不兼容问题。
- 查看mysql的sql_mode
show variables like '%mode%';
-
开启严格模式
方式一:直接使用命令修改
set global sql_mode='STRICT_TRANS_TABLES'; set global sql_mode='STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY'; # 多个时用逗号隔开
方式二:修改配置文件my.ini
//开启 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" //关闭 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
-
查看当前是严格模式还是非严格模式
select @@sql_mode;