MySQL
MySQL
1. 前情提要
MySQL是一个 数据库软件
MySQL 是一个 “客户端-服务器”结构的软件
客户端(Client):主动发起请求的一方
服务器(Server):被动接受请求的一方
他们是通过网络进行通信的
客户端给服务器发起的数据 称为 请求(Request)
服务器给客户端返回的数据 称为 响应(Response)
MySQL服务器是真正的本体,负责保存和管理数据
分布式?一台机器可以处理的数据是有限的
内存和硬盘的区别
内存反应速度快 比硬盘快 几千倍左右
内存成本高空间小
硬盘成本低空间大
以上都是相对而言的
MySQL 存储的内存是存储在硬盘中的 持久化存储 (相对于内存)
存储在内存中的数据是 易失的 (程序重启/掉电 就会丢失)
线上数据库/生产环境数据库 --------> 被用户访问的、真是信息的用户信息
线下数据库 -------->
对重要资料进行备份
2. MySQL的操作
SQL语言:大小写不敏感的
-
创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name
说明:
- 大写表示关键字
- [] 是 可选项
- CHARACTER SET:指定数据库采用的字符集
- COLLATE:指定数据库字符集的校验规则
当我们创建数据库没有指定字符集和校验规则的时候 ,
系统默认的字符集是 utf8
校验规则是:utf8_general_ci
实例:
- 创建名为 java109 的数据库
create database 数据库名;
create database java109;
单词单词之间 空格隔开
create 、database 都是 SQL语言的关键词
- 如果存在 名为 java109 的数据库则不创建 (用途 : 避免MySQL 报错 方便批量执行)
create database if not exists java109;
实际工作中,把一系列的sql写到一个文件中批量执行,如果出现了一条报错 后面的都不会执行
-
创建数据库的时候可以手动指令字符集
character set 字符集/ charset 字符集
create database if not exists java109 character set utf8mb4;
咱需要在数据库中保存中文,必须要在创建数据库的时候,手动指定编码方式为支持中文的编码:GBK,UTF8
一个汉字占几个字节?
不同的字符集,不同的编码方式下,汉字占的字节不一样
gbk中 汉字占 2 个字节
utf8中 一个汉字通常的 3 个字节
unicode 是给 一个字符进行编码 无法给字符串进行编码
utf8 是 基于 unicode 演化出的 字符串编码的版本
mySQL 的 utf8 是一个残本 不是完全体的 少了一些 emoji 表情
建议使用 utf8mb4 有 emoji 表情
-
查看数据库
show databases;
-
选择数据库
use 数据库名;
针对表进行增删改查
表是从属于 数据库的
要针对操作,就需要先把哪个数据库的表这个事情,指定清楚
-
删除数据库
语法:
drop database [if exists] db_test1;
数据库删除以后,内部看不到对应的数据库,里面的表和数据全部被删除
非常危险 的操作
3. 数据表的操作
3.1 数据库中的数据类型
数据类型 | 大小 | 说明 | 对应java类型 |
---|---|---|---|
bit[(M)] | M指定位数,默认为1 | 二进制数,M范围从1到64,存储数值范围从0到2^M-1 | 常用Boolean对应BIT,此时 默认是1位,即只能存0和1 |
tinyint | 1字节 | Byte | |
smallint | 2字节 | Short | |
int | 4字节 | Integer | |
bigint | 8字节 | Long | |
float(M,D) | 4字节 | 单精度,M指定长度,D指定 小数位数。会发生精度丢失 | Float |
double(M,D) | 8字节 | Double | |
decimal(M,D) | M/D最大值+2 | 精度高,但是同时牺牲了时间和空间,运算变慢 , 占用空间更多 | BigDecimal |
numeric(M,D) | M/D最大值+2 | BigDecimal |
一起说明一下(M,D)
()用来描述精度
M 表示小数长度 包括小数点前
D 表示小数点后的位数
这里的 double 和 float 跟 java类似
都是 IEEE754 标准浮点数
会发生精度丢失 存在误差
3.2 字符串类型
数据类型 | 大小 | 说明 | java类型 |
---|---|---|---|
varchar(size) | 0-65,535字节 | 可变长度字符串 | String |
text | 0-65,535字节(64K) | 长文本数据 | String |
mediumtext | 0-16 777 215字节 | 中等长度文本数据 | String |
blob | 0-65,535字节 | 二进制形式的长文本数据 | byte[] |
varchar(size) 这里的 size 的意思是 存储空间
但是注意
当你写了 size 为10 他不是立刻给你10 的空间 而是先给你一部分的 如果不够 自动扩容 但是最大不超过10
blob 是 存储二进制数据
- 文本数据存储的都是字符,这些字符是可以在码表中对应的码中找到的
- 在码表上查不到的,就是二进制数据
- 图片,音乐,视频 都属于 二进制数据
一般很少会 在数据库的 某一列中 存储特别大的数据(几十M,几百M)的数据
这么做会 大大影响到 数据库的 增删改查的效率
实际开发中如果需要保存图片,一般都是把图片放在专门的母驴中让数据库保存 图片路径
3.3 日期类型
数据类型 | 大小 | 说明 | 对应的java类型 |
---|---|---|---|
datetime | 8字节 | 范围从1000到9999年,不会进行时区的检索及转换。 | java.util.Date、 java.sql.Timestamp |
timestamp | 4字节 | 范围从1970到2038年,自动检索当前时 区并进行转换。 | java.util.Date、 java.sql.Timestamp |
上述类型中 只需要掌握:
- int
- long
- double
- decimal
- varchar
- datetime
3.4 表操作
针对数据表的操作 前提:选中数据库 use db_test
-
创建表
语法:create table (列名 类型、列名、类型);
create table table_name(field1 datatype);
- 如果确实想让表名和列名 和关键字一样 可以用 反引号`来表明、列名 引起来
- 这里注意 类型在 列名后面 跟 java不一样
这里创建了一个 int 类型的 学号 以及 一个 name 的 最多存放 20 个 字符的 字符串
0.03 sec 是 用了0.03 second (挺慢的时间)///
mySQL 这样的数据库,性能是短板
-
查看数据库 中的所有表
语法:
show tables;
-
查看指定表的结构
语法:
desc student;//desc是 describe描述的缩写
-
Field:字段
-
Type:类型
这里有要注意的点:
int(11) 这里的 11 表示的是显示宽度(显示这个int类型的时候,最多是占据11个字符的宽度 和 存储时候的容量无关) int是 四个字节
-
Null 空值
表格中的这个格子 是没填的
这里的 YES 的意思是 这里允许是空的
所以这里 Null 的意思就是 是否可以为空
-
Key 索引的类型
-
Default 默认值
-
Extra 扩充
-
-
删除表
语法
drop table [if exists] tbl_name;
课后作业
create table if not exists goods
(
goods_id int comment '商品编号',
goods_name varchar(32) comment '商品名称',
unitprice int comment '单价,单位分',
category varchar(12) comment '商品分类',
provider varchar(64) comment '供应商名称'
);
这里要注意看一个点 这里的单价 是利用了 int 数据 没有使用 decimal 数据
原因是 decimal数据虽然精度很高但是有致命缺陷就是 效率很低
所以这里利用了 int 数据
将钱 化为单位 分 来运算 比如
0.5元 = 50分