MySQL学习(二)
MySQL学习(二)
昨日回顾
存取演变史
普通文本-->软件开发目录规范-->数据库应用
应用发展史
本地服务-->网络服务
数据库本质
数据库指代正在运行处理数据的程序,数据库软件指代操作该进程的软件
数据库软件的本质就是基于CS架构的软件
数据库分类
1.关系型数据库
MySQL、Oracle、PostgreSQL、MariaDB、sqlite、sql server
2.非关系型数据库
Redis、MongoDB、Memcache
SQL与NoSQL
SQL指代的就是操作关系型数据库的语句
NoSQL指代的就是操作非关系型数据库的语句
系统服务制作
1.环境变量添加
cd /usr/local/mysql/bin
2.启动服务
./mysql -uroot -p
修改密码
mysqladmin -u用户名 -p原密码 password 新密码
基本SQL语句
SQL语句的结束符是分号
针对库
show databases; # 查看所有的库名称
show create database db1; # 指定查看某个库的信息
create database db1; # 增加库
alter database db1 charset='gbk'; # 修改字符编码
drop database db1; # 删除库
针对表
select database(); # 查看当前在哪个库下
use db1; # 切换到指定库下
show tables; # 查看当前库下所有的表名称
show create table t1; # 指定查看某个表的信息
desc t1; # 指定查看表的字段信息
create table t1(id int,name varchar(32)); # 增加表
alter table t1 rename ttt; # 修改表名
drop table t1; # 删除表名
针对记录
select * from 表名; # 查看表里面所有的数据
select id,name from 库名; # 查看库里面所有的数据
select * from mysql.user\G; # 逐行显示表字段
select Host,User from mysql.user; # 查看指定字段
insert into t1 values(1,'值'); # 增加单条数据
insert into t1 values(),(),(); # 增加多条数据
update t1 set name='值' where id=1; # 将id为1的name字段修改
delete from t1 where name='值'; # 删除掉所有name为值的
今日学习内容
字符编码与配置文件
查看MySQL默认字符编码
\s
如果是5.X系列 显示的编码有多种
latin1
gbk
如果是8.X系列 显示的统一是utf8mb4
utf8mb4是utf8优化版本 支持存储表情
统一字符编码
步骤1:拷贝一份该配置文件并修改名称为my.ini
步骤2:清空my.ini文件内的内容
步骤3:添加固定的配置信息即可
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
步骤4:保存并重启服务端即可生效
net stop mysql
net start mysql
存储引擎
# 什么是存储引擎
存储引擎可以理解为处理数据的不同方式
# 查看存储引擎
show engines;
MyISAM:5.1之前版本MySQL默认的存储引擎
特点:存取数据的速度快 但是功能很少 安全性较低
InnoDB:5.1之后版本MySQL默认的存储引擎
特点:有诸多功能 安全性较高 存取速度没有MyISAM快
BlackHole
特点:任何写入的数据都会立刻消失(类似于垃圾回收处理站)
Memory
特点:以内存作为数据存取地 速度快但是断电立刻丢失
# 自定义选择存储引擎
create table t1(id int)engine=myisam;
create table t2(id int)engine=innodb;
create table t3(id int)engine=blackhole;
create table t4(id int)engine=memory;
创建表的完整语法
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
);
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件可以写多个 空格隔开即可(后面详细讲解)
字段名1 字段类型(数字) 约束条件1 约束条件2 约束条件3
4.最后一行字段结尾不能加逗号
字段类型之整型
整型
整形类型 | 整型大小 |
---|---|
tinyint | 1bytes |
smallint | 2bytes |
int | 4bytes |
bigint | 8bytes |
上述整型的区别在于从上往下能够存储的数字范围越来越大
注意事项
1.需要考虑正负数的问题 如果需要存储负数 则需要占据一个比特位
2.注意手机号如果使用整型来存储 需要使用bigint才可以
"""
工作小技巧:有时候看似需要使用数字类型存储的数据其实可能使用的是字符串
因为字符串可以解决不同语言对数字不精确的缺陷!!!
"""
create table t5(id tinyint);
insert into t5 values(-129),(256);
# 如果是在5.6版本不会报错 会自动处理成最大范围(没有意义)
步骤1:set global sql_mode = 'STRICT_TRANS_TABLES';
步骤2:退出客户端 重新登录即可
# 如果是在5.7及以上版本 则会直接报错(更加合理)
验证(结论)发现所有的整型都默认带有正负号 如何修改不带正负号(约束条件)
create table t6(id tinyint unsigned);
字段类型之浮点型
浮点型类型 | 浮点型位数 |
---|---|
float | (255,30) 总共255位 小数位占30位 |
double | (255,30) 总共255位 小数位占30位 |
decimal | (65,30) 总共65位 小数位占30位 |
精确度:decimal>double>float
正常业务使用float即可,高精度可使用decimal
字段类型之字符类型
字符类型分两种,char和varchar,定长和变长
定长:设定好最大存储限额,不足使用空格填充,超过就报错
变长:设置好最大存储限额,有几个存几个,超过的依旧报错
如果是5.6版本并且没有修改严格模式 则会自动截取四个字符(不合理也不实用)
# 临时修改
步骤1:set global sql_mode = 'STRICT_TRANS_TABLES';
步骤2:退出客户端 重新登录即可
# 永久修改
修改my.ini配置文件
sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY'
重启服务端之后永久生效
varchar在存数据的时候会生成一个1bytes的报头 记录数据长度
varchar在取数据的时候先会读取1bytes的报头 从中获取真实数据长度
类型 | 优点 | 缺点 | 使用场景 |
---|---|---|---|
char | 速度快 | 空间浪费 | 规模较小,数据量相对固定的字典 |
varchar | 节省空间 | 速度较慢 | 规模较大,数据交杂的数据 |
数字的含义
字段类型括号内的数字大部分情况下是用来限制存储的长度
但是在整型中并不是用来限制长度 而是用来控制展示长度
create table t12(id int(3));
insert into t12 values(1111); # 超过位数依旧不会报错
create table t13(id int(3) zerofill);
insert into t13 values(1); # 001,位数不够用0填充
insert into t13 values(1111); # 有几位就展示几位
以后涉及到整型字段 都无需自己定义长度 直接使用自带的即可
而针对其他类型的字段 则需要自己添加数字
字段类型之枚举与集合
# 枚举
多选一
create table t14(
id int,
name varchar(32),
gender enum('male','female','others')
);
'''插入数据的时候 针对gender只能填写提前定义好的数值'''
# 集合
多选多(也可以多选一)
create table t15(
id int,
name varchar(32),
hobby set('数据1','数据2')
);
字段类型之日期类型
date 年月日
datetime 年月日时分秒
time 时分秒
year 年
create table t16(
id int,
name varchar(32),
reg_time datetime,
birth date,
study_time time,
join_time year
);
# 针对时间数据一般都是通过代码自动获取并添加
约束条件
约束条件是基于字段类型之上的额外限制
id int unsigned
# 字段类型int规定了id字段只能存整数,约束条件unsigned指的是整数基础之上还必须是正数
-
无需正负号:unsigned
-
零填充:zerofill
-
非空:not null
create table t18(id int,name varchar(32) not null);
insert into t18(id) values(2); # 报错
insert into t18(id,name) values(2,null); # 报错
insert into t18(id,name) values(2,''); # 不报错 -
默认值:default
create table t19(id int,name varchar(32) default '默认值');
-
唯一值:unique
'单列唯一:某个字段下对应的数据不能重复 是唯一的'
create table t20(id int,name varchar(32) unique );
'多列唯一:多个字段下对应的数据组合到一起的结果不能重复 是唯一的'
create table t21(id int,host varchar(32),port int,unique(host,port)); -
主键:primary key
主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值 作用: 用来保证数据完整性 用来和其他表建立联系用的 是提高查询排序的速度 个数: 主键只能有一个 一个表可以有多个外键 一个表可以有多个惟一索引 -
自增:auto_increment
配合主键一起使用, 用户以后在添加数据的时候就不需要自己记忆主键值
主键字段的编写:id int primary key auto_increment
今日小结
今日学习笔记就到这里了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现