阶段三:MySQL8基本使用

阶段三:MySQL8基本使用

数据定义语言-库

1、MySQL的组成结构(理解)

image
注:我们平常说的MySQL,其实主要指的是MySQL数据库管理软件。

一个MySQL DBMS可以同时存放多个数据库,理论上一个项目就对应一个数据库。如博客项目blog数据库、商城项目shop数据库、微信项目wechat数据库。

表:一个数据库包含多张数据表,而数据表才是真正用于存放数据的位置。(类似于Excel表格)。

列:一个数据表包含多个字段,每个字段就是一个属性。比如,一个用户表,需要保存用户账号、密码等;

行:一个数据表除了字段以外,还有很多行,每一行都是一条完整的数据(记录)。

2、数据库的基本操作

编写SQL语句是一个比较细致工作,(初学者)不建议大家直接在终端中输入SQL语句,可以先把你要写的SQL语句写入一个记事本中,然后拷贝执行。

① 查看所有数据库

mysql> show databases;                    -- 显示 => show;数据库 => database;
mysql> show create database 数据库名称;   -- 查看指定数据库的创建语句

② 创建数据库

mysql> create database 数据库名称 [设置编码格式];    -- 创建 => create;数据库 => database;
-- 特别说明:
--    不能创建相同名字的数据库!即,不能重复创建一个数据库
--    数据库名由字母+数字+下划线组成,以字母开头,不能有中文以及特殊字符
--    当一条SQL语句编写完毕后,一定要使用分号;进行结尾,否则系统认为这条语句还没有结束。

-- 方式一:创建db_itheima库     
mysql> create database db_itheima; 

-- 方式二:创建db1库并指定默认字符集                            
mysql> create database db_itheima default charset gbk; 

-- 方式三:如果存在不报错(if not exists)
mysql> create database if not exists db_itheima default character set utf8;    

③ 删除数据库

mysql> drop database 数据库名称;     -- 删除 => drop 数据库 => database

mysql> drop database db_itheima;    -- 比如,删除 db_itheima

④ 选择数据库

从数据库列表中查找需要使用的数据库

mysql> use 数据库名称;     -- use 使用

mysql> use db_itheima;    -- 比如,选中 db_itheima

查看正在使用的数据库(8.0以后版本需要基于select查询来获取当前数据库)

mysql> select database();

3、关于编码格式(补充)

编码格式,常见的gbk(中国的编码格式)与utf8(国际通用编码格式)

latin1:这是早期的字符编码格式,支持256个字符,适用于基本的西方语言字符集。
gb2312/gbk:由于latin1的字符集无法表示汉字,中国开发了自己的编码格式gb2312,后来升级为gbk,以支持更多汉字和扩展字符集。
big5:中国台湾也开发了一套用于表示繁体中文的字符编码格式,称为big5,适用于繁体中文字符集。
utf8:为了支持多语言环境,国际标准化组织开发了utf8编码,能够表示几乎所有已知语言的字符。由于早期版本的utf8不完全支持某些特殊符号和表情符号,MySQL5.6版本以后推出了utf8mb4,用于支持更多字符(如Emoji表情),每个字符最多使用4个字节(理论值:256\*256\*256\*256)。

小结

查看数据库:SHOW DATABASES; 创建数据库:CREATE DATABASE 数据库名; 删除数据库:DROP DATABASE 数据库名; -- 慎重操作 使用数据库:USE 数据库名;select database(); 将来工作后,上面四大语句的使用频率,大概在10%。

数据定义语言-表

DDL要学4个关键字:create(创建)、drop(删除)、alter(修改)、show(查询)

特别注意:创建数据表必须有一个前提,首先要明确选择某一个数据库。

1、表的基本操作

☆ 查询表

mysql> use 数据库名称;     -- use 先切换到具体的库
mysql> show tables;       -- 还是 show 命令

显示数据表的创建过程(编码格式、字段等信息)

mysql> desc/describe 数据表名称;
mysql> show create table 数据表名称;
image

☆ 创建表

mysql> create table 数据表名称(
        字段1 字段类型 [字段约束],
        字段2 字段类型 [字段约束],
        ...
); 

常用字段类型
    整数:int(-21亿 ~ 21亿)
    浮点:decimal(M,N),M代表整数长度 + 小数总长度,N代表小数点后保留几位小数,decimal(5,2) => 999.99
    字符串类型:固定长度用char(M),变化长度用varchar(M) => M代表最大字符数
       varchar(10) -- VMWare
    枚举类型:enum('男','女'),限定要么为男,要么为女

案例:创建一个admin管理员表,拥有3个字段(编号、用户名称、用户密码)

mysql> create database db_itheima;
mysql> use db_itheima;
mysql> create table tb_admin(
    id tinyint,              -- 微整型,范围-128 ~ 127,无符号型,则表示0 ~ 255
    username varchar(20),    -- varchar代表变化长度的字段,理论值最大65535个字符
    password char(32)        -- char代表固定长度的字段
) engine=innodb default charset=utf8;        
use在MySQL中的含义代表选择,use 数据库名称相当于选择指定的数据库。而且use比较特殊,其选择结束后,其尾部可以不加分号;但是强烈建议所有的SQL语句都要加分号,养成一个好习惯。

案例:创建一个article文章表,拥有4个字段(编号、标题、作者、内容)

mysql> use db_itheima;
mysql> create table tb_article(
        id int,
        title varchar(50),
        author varchar(20),     -- varchar存储的最大长度,理论值65535个字符
        content text            -- 文本类型,varchar存储不了的字符串信息,建议用text
) engine=innodb default charset=utf8mb4;    -- 相比于utf8,推荐utf8mb4
补充
varchar类型,理论值最大65535个字符。但是实际上,有几个字符是用于存放内容的长度的,所以真正可以使用的不足65535个字节,另外varchar类型存储的字符长度还和编码格式有关。1个GBK格式的占用2个字节长度,1个UTF8格式的字符占用3个字节长度。GBK = 65532\~65533/2个字符,UTF8 = 65532\~65533/3个字。
utf8 支持 3 字节字符(如中文),不支持 Emoji;
utf8mb4(UTF-8 Unicode Transformation Format 4-byte)支持 4 字节字符(含 Emoji 表情、生僻字);

☆ 删除表

mysql> drop table 数据表名称;

☆ 修改表名称

rename table 旧名称 to 新名称;

☆ 修改表字段(多写)

① 添加字段

mysql> alter table 数据表名称 add 新字段名称 字段类型 first;
mysql> alter table 数据表名称 add 新字段名称 字段类型 after 其他字段名称;
选项说明:
first:把新添加字段放在第一位
after 字段名称:把新添加字段放在指定字段的后面

案例:在tb_article文章表中添加一个addtime字段,类型为date(年-月-日)

日期类型有:date(年-月-日)、time(小时:分钟:秒)、datetime(年-月-日 小时:分钟:秒)

mysql> alter table tb_article add addtime date after content;
mysql> desc tb_article;

② 删除字段

mysql> alter table tb_article drop 字段名称;
mysql> desc tb_article;

③ 修改字段名称、类型

修改字段名称与字段类型(也可以只修改名称)- change

mysql> alter table tb_admin change username name varchar(40);
mysql> desc tb_admin;

说明:
change 比较神奇,既可以修改字段名称,又可以修改字段类型!
change 源字段名称 修改后字段名称 修改后的字段类型(这个也可以不改,但是必须要写)

仅修改字段的类型 - modify

mysql> alter table tb_admin modify name varchar(20);
mysql> desc tb_admin;

说明:
modify 字段名称 新字段类型(仅可以修改字段类型)

课堂练习

情景:

在企业开发中,小明接到一个需求,要求参与研发一套新的OA系统。其中有一张管理员表,交给了他。

1、创建一张表 tb_admin( id、name、sex)

2、应前端要求,添加字段address、phone_number;

3、后来发现,地址信息几乎不怎么用,要求把 address 字段删除;

4、后来组员提出疑问,性别用gender(音,巾德儿)更合适。建议把 sex 字段改成 gender;

延申:字段类型没有规定,大家按自己进行设计。int(11) 和 int 有什么区别?

总结

*-- 查看*
show databases;
show tables;
*-- 查看创建信息*
show create database db_itheima;
show create table db_admin;
*-- 查看表*
desc db_admin;
describe db_admin;

2、字段类型详解(重点)

整数int、浮点数decimal、字符串char/varchar/text、枚举类型enum、日期时间类型date、time、datetime

官方链接:https://dev.mysql.com/doc/refman/8.0/en/data-types.html

1 整数类型

分类类型名称说明
tinyint很小的整数(1 Byte)-128 \~ 127
smallint小的整数(2 Bytes)-32768 \~ 32767
mediumint中等大小的整数(3 Bytes)-8388608 \~ 8388607
int(integer)普通大小的整数(4 Bytes)-2147483648 \~ 2147483647

选择整数类型,往往存储范围!

age tinyint unsigned => 0 - 255,只需要记住tinyint和int即可!!!

举个例子:

create table tb_student(
    id int,
    name varchar(20),
    age tinyint unsigned
) default charset=utf8;

SQL优化手段:尽量选择满足这个字段范围区间的数据类型!!!

2 小数类型

小数类型,也分为浮点类型(精度失真情况)和定点类型(推荐使用)。

分类类型名称
float单精度浮点数
double双精度浮点数
decimal(m,d)定点数,decimal(10,2)
decimal(10,2) :10 代表总长度,2代表保留2位小数,因此,整数只剩8位。比如,decimal(5,2) 最大为 999.99

建议:① 精度要求不高(2-4位小数的情况,影响不大),可以使用float/double

② 如果精度要求比较高的情况,可以使用decimal

参考阅读:https://blog.csdn.net/weixin_45729934/article/details/121389109

案例:

create table tb_product(
    id int,
    name varchar(100),
    price decimal(11,2)
) default charset=utf8;
1美元 = 7.85人民币。1人民币 = 0.1067美元

3 日期类型

类型名称
yearYYYY 1901\~2155
timeHH:MM:SS -838:59:59\~838:59:59
dateYYYY-MM-DD 1000-01-01\~9999-12-3
datetimeYYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00\~ 9999-12-31 23:59:59
timestampYYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC\~2038-01-19 03:14:07UTC

选日期类型看格式,用的最多的是 => date、datetime

date:年-月-日

time:小时:分钟:秒数

datetime = date + time合并

案例:

create table tb_news(
    id int,
    title varchar(100),
    addtime datetime
) default charset=utf8;

4 字符串(文本)类型

类型名称说明
char(m)m为0\~255之间的整数定长(固定长度),m代表字符长度,255代表不能超过255个字符
varchar(m)m为0\~65535之间的整数变长(变化长度),65535代表字节长度,和编码有关,utf8最多2万多个汉字
text
mediumtext允许长度0\~167772150字节
longtext(扩展)允许长度0\~4294967295字节

特殊字符串:

枚举类型 enum('值1','值2','值3'),从多个值中选择其中的某一个!适用于订单状态等场景;

选择文本,主要长度,固定char、变化varchar、更长的就是text。
varchar(m):理论值65535个字符,但是理论上底层最大能存储的字节数也是65535。但是如果是汉字,和编码格式有关,gbk模式下,1个汉字2个字节,理论上大概能3万左右个汉字。utf8模式下,1个汉字3个字节,理论值就是2万多个汉字。

5 二进制类型(了解)

类型名称说明适用场景
BINARY(N)固定长度二进制(如 UUID、哈希值)存储加密密钥、定长标识符
VARBINARY(N)可变长度二进制(如小文件)存储图片缩略图、API 响应数据
BLOB系列(音,布洛勃)大文件(如图片、视频)权衡性能与便利性,优先存储路径
BLOB,是Binary Large Object的缩写,二进制大对象。
注意,大的二进制文件,一般都存储在文件系统当中,很少存放在MySQL当中。

小结

记住以下这些常用的,就可以

类型具体类型场景说明 整数tinyint一些小的范围 int4个字节 小数decimal(m, n)最常用的浮点表示 日期date表示日期(2022-10-20,常见于数据仓库) datetime具体到时间 timestamp时间戳,用的最多,记录的UTC时间 文本 (字符串)varchar最常用(占到80%) text大段的描述 enum枚举类型

UTC (Coordinated Universal Time,协调世界时),以原子时秒长(纳秒级)为基准。

3、auto_increment(重点)

作用:自动增长,往往用于设置主键,可以让其值自动增长,默认从1开始,依次递增。

drop table users;
create table users(
  id int auto_increment primary key,
  name varchar(20),
  age tinyint unsigned,
  gender enum('male', 'female') default 'male'
) default charset=utf8mb4;

-- 设置 auto_increment 后,可以不输入 id 了
insert into users values (null, '张三', 23, 'male');
insert into users values (null, '李四', 24, 'male');
delete from users where id = 2;
insert into users values (null, '王五', 25, 'male');
思考:
1、int auto_increment 范围多少,会不会有数值超出边界,存不进去的可能?
2、如果分布式数据库进行数据归并,会不会出现 id 碰撞?
3、根据 id 值,是不是可以推断业务的数据量,造成安全风险?
引申:
UUID(Universally Unique Identifier,通用唯一识别码)也是一种常见的主键生成策略,天然全局唯一。在分布式数据库中作为主键,被广泛使用。

数值边界举例——摩托车的里程表,当行驶到99999时,再开1公里,里程表将会显示00000,导致显示错误。

image

数据操作语言

1、DML包括哪些SQL语句

insert插入、update更新、delete删除

增删改查,除了查询是Query,其他三个都是操作(Manipulation)

2、数据的增删改(重点)

☆ 数据的增加操作

insert into 数据表名称([字段1,字段2,字段3...]) values (字段1的值,字段2的值,字段3的值...);
特别注意:在SQL语句中,除了数字,其他类型的值,都需要使用引号引起来,否则插入时会报错。

第一步:准备一个数据表

use db_itheima;
create table tb_user(
        id int,
        username varchar(20),
        age tinyint unsigned,  # 无符号
        gender enum('男','女','保密'),
        address varchar(255)
) engine=innodb default charset=utf8mb4;

-- 这里,charset=utf8; 等价于character set utf8;
unsigned 代表无符号型,只有0到正数。tinyint unsigned无符号型,范围0 \~ 255
enum 枚举类型,多选一。只能从给定的值中选择一个,或者输入 null

第二步:使用insert语句插入数据

insert into tb_user values (1,'刘备',34,'男','广州市天河区');
insert into tb_user(id,username,age) values (2,'关羽',33);

-- 简单引入一下查询命令
select * from tb_user;

第三步:批量插入多条数据

insert into tb_user 
    values (3,'大乔',19,'女','上海市浦东新区'),
           (4,'小乔',18,'女','上海市浦东新区'),
           (5,'马超',26,'男','北京市昌平区');

-- 简单引入一下查询命令
select * from tb_user;

☆ 数据的修改操作(重要)

update 数据表名称 set 字段1=更新后的值,字段2=更新后的值,... [where 更新条件];

where:更新条件,满足条件的才会被更新,如果不写where则默认修改所有记录!
特别说明:如果在更新数据时,不指定更新条件,则其会把这个数据表的所有记录全部更新一遍。

案例:修改username='赵飞'这条记录,将其性别更新为男,家庭住址更新为广东省深圳市

select * from tb_user where username='赵飞';
update tb_user set gender='男',address='广东省深圳市' where username='赵飞';

案例:今年是2025年,假设到了2026年,现在存储的学员年龄都差1岁,整体进行一次更新

mysql> update tb_user set age=age+1;

☆ 数据的删除操作

mysql> delete from 数据表名称 [where 删除条件];

案例:删除tb_user表中,id=1的用户信息

mysql> delete from tb_user where id=1;

delete from与truncate清空数据表操作

mysql> delete from 数据表;
或
mysql> truncate 数据表;

面试题:delete from与truncate区别在哪里?

小结

DML:数据操作语言,主要涉及增加(INSERT)、修改(UPDATE)、删除(DELETE)

补充:软删除 vs 硬删除

-- 实际企业当中,使用的是 update 进行删除的
update tb_user set status = -1 where username='赵飞';
update tb_user set del_flag = 1 where username='赵飞';

select * from tb_user where username='赵飞' and status <> -1;
select * from tb_user where username='赵飞' and del_flag <> 1;

3、字段约束详解

字段约束:在数据类型的基础上,给字段添加约束行为(如不能为空等等)

create table 数据表名称(
     字段名称  字段类型  [可选,字段约束]
) default charset=utf8mb4;

在MySQL中,字段约束一共有五种约束:①非空约束 ②默认值约束 ③唯一约束 ④主键约束 ⑤外键约束

非、默、唯一、主

☆ 非空约束

强调:非空,这个列不允许出现null空值

not null

案例:创建一个商品表goods,有id主键,name商品名称,price商品价格,name和price都必须为非空!

create table goods(
        id int primary key,
        name varchar(80) not null,
        price decimal(11,2) not null
) default charset=utf8mb4;

-- 插入数据
insert into goods values (1, 'Python从入门到放弃', 99.99);
-- 插入数据(错误演示)
insert into goods values (2, 'Java从入门到放弃', null);
image

☆ 默认值约束

强调:默认值,插入数据时,如果没有指定对应的值,则其自动使用默认值做为最终结果

default 默认值

案例:创建一个用户表users,id主键、name用户名、age年龄、gender性别,要求gender默认值为male

drop table users;
create table users(
  id int primary key,
  name varchar(20),
  age tinyint unsigned,
  gender enum('male', 'female', 'unknown') default 'unknown'    -- 性别
) default charset=utf8mb4;
desc users;

-- 插入数据
insert into users values (1, '张三', 18, 'male');
-- 插入数据(触发默认值)
insert into users(id, name, age) values (2, '李四', 18);

-- default
insert into users values (3, '王五', 18, default);        -- default在这里将会被导入成默认值

-- 插入数据(不使用默认值)
insert into users values (4, '赵六', 18, 'female');
insert into users values (5, '小明', 18, null);
gender,性别(音,今德儿)

☆ 唯一约束

强调:唯一,可以为空;一个表中可以同时拥有多个唯一约束

unique (音,优尼克。意,唯一的)

案例:创建一个用户表,id主键,name,age,code(身份证号码,要求唯一)

create table users(
        id int primary key,
        name varchar(20),
        age tinyint unsigned,
        code char(18) unique
) default charset=utf8mb4;

-- 插入数据
insert into users values (1, '张三', 18, '123456789012345678');
-- 插入重复数据(错误演示)
insert into users values (2, '李四', 18, '123456789012345678');
-- 插入数据,但是唯一列为null
insert into users values (2, '王五', 18, null);

☆ 主键约束(重点)

强调:非空、唯一、一个表中最多有且仅有1个主键,在MySQL中,往往id字段都是主键(primary key)

article文章表(id主键,title标题,author作者,addtime发布时间)

use db_itheima;
create table article(
    id int primary key,
    title varchar(80),
    author varchar(20),
    addtime date
) default charset=utf8mb4;

或

create table article(
    id int,
    title varchar(80),
    author varchar(20),
    addtime date,
    primary key(id)
) default charset=utf8mb4;

案例:

use db_itheima;
create table article(
    id int primary key,
    title varchar(80),
    author varchar(20),
    addtime date
) default charset=utf8mb4;

-- 查看数据表
desc article;
-- 向表中插入数据
insert into article values (1, 'MySQL数据库运维', '张三', '2025-02-10');
-- 主键强制为null(错误演示)
insert into article values (null, 'Python运维开发', '李四', '2025-02-10');
-- 主键强制重复(错误演示)
insert into article values (1, 'Python运维开发', '李四', '2025-02-10');

-- 因此,主键不能重复,不能为空

主键约束唯一约束区别?

和主键约束相同点:都是唯一的

和主键约束不同点:主键非空、有且仅有1个;唯一可以为null,在一个表中也可以同时拥有多个

☆ 外键约束(了解)

强调:多表,级联操作

image

外键约束前提:

① 多表

② 数据表引擎必须为InnoDB引擎

小结

MySQL语句中,一共有5种:(非空约束、默认值约束、唯一约束、主键约束、外键约束)