MySQL

MySQL

1. 前情提要

MySQL是一个 数据库软件

MySQL 是一个 “客户端-服务器”结构的软件

客户端(Client):主动发起请求的一方

服务器(Server):被动接受请求的一方

他们是通过网络进行通信的

客户端给服务器发起的数据 称为 请求(Request)

服务器给客户端返回的数据 称为 响应(Response)

MySQL服务器是真正的本体,负责保存和管理数据

分布式?一台机器可以处理的数据是有限的

内存和硬盘的区别

内存反应速度快 比硬盘快 几千倍左右

内存成本高空间小

硬盘成本低空间大

以上都是相对而言的

MySQL 存储的内存是存储在硬盘中的 持久化存储 (相对于内存)

存储在内存中的数据是 易失的 (程序重启/掉电 就会丢失)

线上数据库/生产环境数据库 --------> 被用户访问的、真是信息的用户信息

线下数据库 -------->

对重要资料进行备份

2. MySQL的操作

SQL语言:大小写不敏感的

  1. 创建数据库

    语法:

    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

    实例:

    1. 创建名为 java109 的数据库

    create database 数据库名;

    create database java109;
    

    单词单词之间 空格隔开

    create 、database 都是 SQL语言的关键词

    1. 如果存在 名为 java109 的数据库则不创建 (用途 : 避免MySQL 报错 方便批量执行)
    create database if not exists java109;
    

    实际工作中,把一系列的sql写到一个文件中批量执行,如果出现了一条报错 后面的都不会执行

    1. 创建数据库的时候可以手动指令字符集

      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 表情

  2. 查看数据库

    show databases;
    
  3. 选择数据库

    use 数据库名;
    

    针对表进行增删改查

    表是从属于 数据库的

    要针对操作,就需要先把哪个数据库的表这个事情,指定清楚

  4. 删除数据库

    语法:

    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[]
  1. varchar(size) 这里的 size 的意思是 存储空间

    但是注意

    当你写了 size 为10 他不是立刻给你10 的空间 而是先给你一部分的 如果不够 自动扩容 但是最大不超过10

  2. blob 是 存储二进制数据

    • 文本数据存储的都是字符,这些字符是可以在码表中对应的码中找到的
    • 在码表上查不到的,就是二进制数据
    • 图片,音乐,视频 都属于 二进制数据
  3. 一般很少会 在数据库的 某一列中 存储特别大的数据(几十M,几百M)的数据

    这么做会 大大影响到 数据库的 增删改查的效率

  4. 实际开发中如果需要保存图片,一般都是把图片放在专门的母驴中让数据库保存 图片路径

3.3 日期类型

数据类型 大小 说明 对应的java类型
datetime 8字节 范围从1000到9999年,不会进行时区的检索及转换。 java.util.Date、 java.sql.Timestamp
timestamp 4字节 范围从1970到2038年,自动检索当前时 区并进行转换。 java.util.Date、 java.sql.Timestamp

上述类型中 只需要掌握:

  1. int
  2. long
  3. double
  4. decimal
  5. varchar
  6. datetime

3.4 表操作

针对数据表的操作 前提:选中数据库 use db_test

  1. 创建表

    语法:create table (列名 类型、列名、类型);

    create table table_name(field1 datatype);
    
    1. 如果确实想让表名和列名 和关键字一样 可以用 反引号`来表明、列名 引起来
    2. 这里注意 类型在 列名后面 跟 java不一样

    image-20240929102959918

    这里创建了一个 int 类型的 学号 以及 一个 name 的 最多存放 20 个 字符的 字符串

    0.03 sec 是 用了0.03 second (挺慢的时间)///

    mySQL 这样的数据库,性能是短板

  2. 查看数据库 中的所有表

    语法:

    show tables;
    

    image-20240929125322044

  3. 查看指定表的结构

    语法:

    desc student;//desc是 describe描述的缩写
    

    image-20240929125252437

    • Field:字段

    • Type:类型

      这里有要注意的点:

      int(11) 这里的 11 表示的是显示宽度(显示这个int类型的时候,最多是占据11个字符的宽度 和 存储时候的容量无关) int是 四个字节

    • Null 空值

      表格中的这个格子 是没填的

      这里的 YES 的意思是 这里允许是空的

      所以这里 Null 的意思就是 是否可以为空

    • Key 索引的类型

    • Default 默认值

    • Extra 扩充

  4. 删除表

    语法

    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分

posted @ 2024-10-01 16:39  Gargenone  阅读(4)  评论(0编辑  收藏  举报