数据库 MySQL基础
数据库 MySQL
- 健康码
- 公安系统
- 支付宝微信支付
- 酒店
- 12306 买票
- 网易云 收藏歌曲
- 手机通话记录 地铁卡余额
- 吃鸡 、王者荣耀 皮肤 装备
Mysql 5.7当前主流数据库
- mysql 被Oracle 收购
- sqlserver
- oracle
- sqlite3
数据库语法都差不多
mysql、sqlite 开源免费
安装数据库
略
五个基本单位
- 数据库服务器 mysql server
- 数据库
- 数据表
- 数据字段
- 数据行
娱乐化讲解表关系
数据库的操作
mysql 以;为结束
连接数据库
mysql -u 用户名 -p密码 mysql -u 用户名 -p 输入密码 mysql -u root -h ip地址 -p 输入密码 -u 用户名-p密码-h host ip地址
退出数据库
exit
创建数据库
mysql> database 数据库名;Query OK, 1 row affected (0.00 sec)mysql> create database if not exists 数据库名;Query OK, 1 row affected (0.01 sec)
查看数据库
show databases;
删除数据库
不要删除 mysql数据库
drop database 数据库名;
选中数据库
mysql> use 数据库名字;Database changed
查看里边的数据表
show tables;
数据表操作
use 数据库名字;show tables;
查看表结构
mysql> desc 表名; ---------- -------------- ------ ----- --------- ---------------- | Field | Type | Null | Key | Default | Extra | ---------- -------------- ------ ----- --------- ---------------- | id | int(11) | NO | PRI | NULL | auto_increment || username | varchar(255) | NO | | NULL | || password | varchar(255) | NO | | NULL | || age | tinyint(4) | YES | | NULL | | ---------- -------------- ------ ----- --------- ---------------- 4 rows in set (0.00 sec)Field 字段名 Type 字段的类型 int 整数 varchar 字符串 tinyint微整型 Null 字段是否可以为空 Key 主键 外键 等 Default 默认值 Extra 额外的 比如自动递增
查看创建表的语句
mysql> show create table 表名; ------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Table | Create Table | ------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | users | CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `age` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 row in set (0.00 sec)engine mysql 引擎 charset mysql 编码
创建数据表
mysql> create table if not exists 表名(字段名 类型(长度),字段2 类型(长度),字段3 类型(长度))engine=innodb default charset=utf8mb4; # mysql 只有 utf8 没有utf-8
Query OK, 0 rows affected (0.04 sec)
mysql> create table if not exists person(id int(11),username varchar(64),password varchar(128))engine=innodb default charset=utf8mb4;Query OK, 0 rows affected (0.04 sec)
删除表
drop table 表名;
数据表字段操作
alter table 表名
修改表字段类型
alter table 表名 modify 字段名 类型(长度);
mysql> alter table 表名 modify 字段名 类型(长度);mysql> alter table users modify age bigint(10); #示例
增加表字段
alter table 表名 add column 字段名 类型(长度); # column 可写可不写
mysql> alter table users add sex tinyint; #默认加到最后面 mysql> alter table users add column tel varchar(11) after password; #指定加到某个字段的后边ysql> alter table users add column height varchar(11) first; #加到第一个位置
删除表字段
alter table 表名 drop column 字段名; #column 可加 可不加
mysql> alter table users drop column sex;
修改表字段
alter table 表名 change 原表名 新名字 类型(长度);
mysql> alter table users change username user_name varchar(128);
change、add 、 modify 都支持后边 加 first 、after
mysql> alter table users modify tel char(11) first;
修改表名
alter table 旧表名 rename 新表名;
数据类型 、引擎、字符集 、索引
数据类型
- 数值类型
- 字符串类型
- 日期类型
- 复合类型
- 空间类型 (了解 不做讲解)
数值类型
类型 | 所占字节 | 范围 |
---|---|---|
tinyint | 1 | -128~127 |
smallint | 2个字节 | -32768-32767 |
mediumint | 3个字节 | -8388608~8388607 |
int | 4个字节 | -2147483648~2147483647 |
bigint | 8个字节 | |
ps: 性别 要么 男 要么 女用 0表示女 1表示男 tinyint就够了
年龄 要使用无符号整型 年龄没有负数
在实际开发过程中 为了避免浪费空间 选择合适的类型
浮点类型
类型 | 字节 | 范围 |
---|---|---|
float(m,d) | 4 | 单精度 m 总个数,d 小数位 float(10,2) |
double(m,d) | 8 | 双精度m 总个数,d 小数位 double(10,2) |
decimal(m,d) | 存储的是字符串的浮点数 |
ps: 浮点型是非精确值 会存在不太准确的情况
decimal 定点数 mysql内部 本质上字符串存储 开发过程中我们 要对 金额等精度要求高的浮点数进行存储 建议使用decimal
字符串
类型 | 字节 | 范围 |
---|---|---|
char | 0-255字节 | 定长 |
varchar | 0-255字节 | 变长 |
tinyblob | 0-255字节 | 不超过255字节的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本 |
text | 0-65535字节 | 长文本 |
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本 |
mediumtext | 0-16777215字节 | 中等长度文本 |
longblob | 二进制形式的极大长度文本 | |
longtext | 极大长度文本 | |
varbinary(M) | 允许长度0-M个字节的定长字符串 | 指的长度 1个字节 |
binary(M) | 允许长度0-M个字节的定长字符串 |
ps: char(100) 如果 字符串长度只有10 剩下的90用空格补齐
varchar(100) 如果字符串长度只有10 剩下的90不用空格补齐 别的字符串可以占用
text blob : text 普通字符串不区分大小写
blob 二进制字符串 区分大小写
大小写修饰符 不适用于 TEXT blob类型
时间类型
类型 | 字节 | 范围 |
---|---|---|
date | 3个字节 | 2021-01-04 |
time | 3个字节 | 16:08:58 |
datetime | 8个字节 | 2021-01-04 16:08:58 |
timestamp | 4个字节 | 自动存储记录的修改时间 |
year | 1个字节 | 年份 |
ps:
1. 网站、app 很多人喜欢用int 来存储时间 int存的是时间戳 方便计算 哪怕前端语言后端语言不一样 只需要将时间转化一下就好 2. 也有人喜欢用datetime 站在数据库角度 方便查看 3. 具体根据实际情况选择
总结
- 论占据空间的大小 从大到小 字符串 日期 数值
- 根据实际情况选择合适的类型 避免浪费 但是也要考虑到后期的扩展情况
复合类型
类型 | 说明 | 举例 |
---|---|---|
set | 集合 | set(‘num1’,‘num2’) |
enum | 枚举 | enum(‘num1’,‘num2’) |
ps:区别 enum只允许从一个集合中取一个
set 允许从一个集合中取任意多个
字段其它属性设置
unsigned 主要适用于 整型 和浮点型 使用无符号 也就说 前面没有 负号 -
可以是 存储的位数更长 以tinyint为例子 -128~127 使用无符号 可以存储 0-255个长度
只需要在创建表的时候 整型或者浮点字段后边加上 unsigned
create table user(id int(11) unsigned);
zerofill 0 不是空格 使用它可以阻止里边填负数 在创建表的时候 在int 或者浮点 后边加上 zerofill
default 设置默认值
mysql> alter table test1 add column age tinyint default 18;
not null 不能为空 精确的说法是 无 其中 0 空格 空字符串’’ 不代表无
字符集
- 常用字符集
- 数据库我们用什么字符集
常用字符集
ascii 使用指定的7位或者 8位 二进制数(只包含 0 1)组合来表示128或者 256种可能的字符
https://www.cnblogs.com/xmxu/archive/2012/07/10/2584032.html 对照表
GBK GB2312的升级版 中国定义的 汉字编码规范 早期 就是gb2312 gbk向下兼容 gb2312
Unicode(统一码 万国码 单一码) 国际定义可以容纳世界上所有的文字和符号的字符编码方案,满足跨语言、跨平台文字处理方案
utf-8(通用转换格式) 万国码 针对 Unicode的可变长度字符编码 空间比ASCII 大一倍 对ASCII 来说 高字节 0 没有任何意义 为了解决这个问题 出现了中间格式字符集 也叫通用转换格式
中文常用的字符集
- gbk
- utf-8
开发中
字符集 | 说明 | |
---|---|---|
utf8_general_ci | Unicode 多语言 不区分大小写 | |
gbk_chinese_ci | 简体中文 不区分大小写 |
ci 存储 排序的时候 不区分大小写
mysql 没有 utf-8 只有utf8