跳转至

Mysql

Mysql管理

net start mysql # 启动mysql服务
net stop mysql # 停止mysql服务

Mysql连接

连接

mysql -u root -p -h [ip] -P [port]
  • -u指定用户名
  • -p表示需要密码
  • -h指定host,默认为localhost
  • -P指定port,默认为3306

断开

exit;

数据库操作、字符集和储存引擎

数据库操作

show databases; # 查看所有数据库
select database(); # 查看当前数据库
use db_name; # 选择操作数据库
alter db_name; # 修改数据

创建数据库

create database [if not exists] db_name
default character set utf8 # 默认字符集
default collate utf8_general_ci; # 默认排序方式

If not exists 用于避免数据库已经存在的报错

删除数据库

drop database [if exists] db_name;

if exists 用于避免数据库不存在的报错

选择数据库

use db_name;

修改数据库

alter database test_db
character set utf8 # 字符集
collate utf8_general_ci; # 排序方式

查询数据库

show databases; # 查看所有数据库
select database(); # 查看当前数据库
select schema_name from schemata; # 查看所有数据库
# 实际上在Mysql5.7之后新增了一个 sys 库,也可以用于查看所有数据库

字符集

字符集简介

show character set; # 查看所有字符集

字符集问题不仅会影响数据存储,还会影响客户端程序与 MySQL 服务器之间的通信。如果希望客户端程序使用与默认字符集不同的字符集与服务器通信,则需要指明是哪一个。

set names 'utf8'

常用字符集

字符集 描述 默认排序方式 最大长度
ascii US ASCII ascii_general_ci 1
utf8mb3 UTF-8 Unicode utf8mb3_general_ci 3
utf8mb4 UTF-8 Unicode utf8mb4_0900_ai_ci 4
gb2312 GB2312 Simplified Chinese gb2312_chinese_ci 2
gbk GBK Simplified Chinese gbk_chinese_ci 2

储存引擎

储存引擎简介

show variables like 'default_storage_engine'; # 查看默认储存引擎
show engines; # 查看所有储存引擎

修改表的储存引擎

alter table tb_name
engines = InnoDB;

储存引擎

储存引擎 描述 优点 缺点
InnoDB InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。 支持事务和外键约束;行级锁定;崩溃恢复功能;支持并发性能优化 消耗更多内存;写入速度相对较慢;可能占用更多磁盘空间
MyISAM 传统存储引擎,适用于读密集型应用 读取速度快;适合静态数据和读取频繁的应用 不支持事务;不支持外键约束;不支持崩溃恢复;表级锁定可能导致并发性能问题
MEMORY 将数据存储在内存中,速度快但数据不持久化 读取速度极快;适用于缓存数据或临时数据 数据不持久化,数据库重启时数据丢失;受限于可用内存大小;不支持事务
NDB Cluster 集群存储引擎,支持分布式事务和高可用性 支持分布式事务;高可用性;支持并行查询;支持实时数据访问 需要专用硬件支持;配置和维护相对复杂;不支持全文本搜索等功能
ARCHIVE 压缩存储引擎,适用于归档数据 数据压缩率高;占用空间少;适用于归档和存储大量历史数据 不支持事务;不支持索引;只支持 INSERT 和 SELECT 操作,不支持 UPDATE 和 DELETE 操作
CSV 将数据存储在 CSV 文件中,适用于导入导出数据 方便导入导出数据;数据可读性好;适用于临时性数据存储 不支持事务;不支持索引;不支持事务;不支持复杂查询

表的操作和完整性约束

表的概述

介绍

MySQL 数据表是用来存储数据的基本结构,它由列和行组成,每列代表一个字段,每行代表一条记录。数据表是数据库中的核心组成部分,用于组织和存储数据,以便进行查询、插入、更新和删除操作。

表的基本组成

image-20240616172726270

数据类型

数值类型

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

字符串类型

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

枚举类型与集合类型

特性 枚举类型 (ENUM) 集合类型 (SET)
定义 用于定义一个具有一组预定义字符串值的列。 用于定义一个可以包含零个或多个预定义字符串值的列。
存储方式 存储为整数,整数表示预定义字符串值的索引。 存储为整数,每个位表示一个预定义字符串值。
最大值的数量 最多 65,535 个不同的值。 最多 64 个不同的值。
使用场景 一个字段只允许一个值的场景,比如性别。 一个字段允许多个值的场景,比如兴趣爱好。
查询语法 SELECT * FROM table WHERE column = 'value'; SELECT * FROM table WHERE FIND_IN_SET('value', column);
插入语法 INSERT INTO table (column) VALUES ('value'); INSERT INTO table (column) VALUES ('value1,value2');
检查包含情况 不能同时包含多个值。 可以同时包含多个值,通过 FIND_IN_SET 函数检查。
优点 节省存储空间,查询效率高,数据一致性高。 灵活性高,可以表示多个值。
缺点 不能表示多个值,修改预定义值列表需要更改表结构。 预定义值数量限制为 64 个,查询和操作稍微复杂。

表的操作

创建表

create table [if not exists] tb_name(
    column datatype ...,
  ...
);

示例

create table [if not exists] users (
    id int auto_increment primary key,
    username varchar(50) not null,
    email varchar(100) not null,
    birthdate date,
    is_active boolean default true
) character set utf8 collate utf8_general_ci;

创建一个user

  • id: 用户 id,整数类型,自增长,作为主键。
  • username: 用户名,变长字符串,不允许为空。
  • email: 用户邮箱,变长字符串,不允许为空。
  • birthdate: 用户的生日,日期类型。
  • is_active: 用户是否已经激活,布尔类型,默认值为 true。

并规定字符集为utf8排序规则为utf8_general_ci

删除表

drop table [if not exists] tb_name;

修改表

alter table tb_name
rename to new_tb_name # 修改表名
add column cl_name datatype # 添加列
modify column cl_name new_datatype # 修改列的数据类型
change column old_cl_name new_cl_name datatype # 修改列名
drop column cl_name; # 删除列
add primary key (cl_name) # 添加 primary key 主键
/*添加foreign key 外建*/
add constraint fk_name
foreign key (cl_name)
references tb_name (cl_name)
/**/

数据完整性约束

create

列级约束

create table tb_name(
    cl_name datatype primary key
)

表级约束

create table tb_name(
    cl_name datatype
  constraint ctr_name ctr_type(cl_name)
);

alter

alter table tb_name
modify cl_name datatype primary key; # 列级主键约束
add constraint pk_name primary key(cl_name); # 表级主键约束
modify cl_name datatype datatype unique key; # 列级唯一键约束
add constraint uk_name unique key(cl_name); # 表级唯一键约束
add constraint fk_name# start
foreign key (cl_name)# 外键约束
references tb_name (cl_name)# end

删除约束

alter table tb_name
drop primary key pk_name # 主键
drop index uk_name # 唯一键
drop foreign key fk_name # 外键

表记录的操作

查询

select column1, column2, ...
from tb_name
[where condition]
[order by cl_name [ASC | DESC]]
[limit number];

插入

insert into tb_name (c1_name1, cl_name2, cl_name3, ...)
values (value1, value2, value3, ...);

更新

update tb_name
set column1 = value1, column2 = value2, ...
where condition;

删除

delete from tb_name
where condition;

表记录的查询

查询语句

select [all|distinct] column1, column2, ...
from tb_source
[where condition]
[order by exp [ASC | DESC]]
[limit number];

查询的列除列名之外,也可以是表达式和常量,tb_source也不一定是表名,子查询或文件等等都可以是数据源

all显示所有数据,distinct去重

where子句

where子句用于在 MySQL 中过滤查询结果,只返回满足特定条件的行。

表达式

查询条件 运算符
关系运算符 >,<,=,>=,<=,=,<>,!=,!>,!<,<=>,like,regexp
逻辑运算符 not,!,or,||,and,&&,xor
范围判断 between and,not between and
空值判断 is null,not is null
集合 in,not in

order by子句

  • asc按照表达式exp结果集升序排列
  • desc按照表达式exp结果集降序排列

聚合函数

函数名 描述
count 获取非空值的个数
sum 求取非空值的和
avg 求取非空值的平均值
max 最大值/最近的时间日期
min 最小值/最远的时间日期

group by子句

对聚合函数查询出的结果集进行分组,having用于过滤分组后的结果

多表连接查询

在MySQL中,多表连接查询(JOIN)是一种从多个表中检索数据的方式。常见的连接类型包括CROSS JOIN、INNER JOIN、LEFT JOIN、RIGHT JOIN

交叉连接

select tb1_name.cl1,tb2_name.cl2
from tb1_name
cross join tb2_name;

交叉连接返回两个表的笛卡尔积

内连接

select tb1_name.cl1,tb2_name.cl2
from tb1_name
inner join tb2_name 
on tb1_name.comon_cl=tb2_name.common_cl;

返回两个表中匹配的记录

外连接

select tb1_name.cl1,tb2_name.cl2
from tb1_name
left|right outer join tb2_name 
on tb1_name.comon_cl=tb2_name.common_cl;

左/右外连接返回对应表的所有记录,即使其他表中没有的记录用NULL占位

子查询

就是内联查询

存在一个表employees

image-20240617223201963

select name from employees where year_joined<(select year(now())-1); # 查询去年之前入职的员工

同理,插入删除更新也是一样的

索引

普通索引

对值没有任何要求

create index idx_name
on tb_name(cl_name);

唯一索引

可以是空值,但值唯一

create unique index uidx_name
on tb_name(cl_name);

主键索引

就是数据完整性约束中的主键

创建索引

和数据完整性约束一样

[constraint idx_name] [unique|fulltext] [idx_name] (cl_name);

Explain语句

explain语句用于分析 SQL 查询语句的执行计划

执行语句

explain select * from company_db.employees;

返回结果分析

字段 解释
id 字段表示查询中执行的步骤编号和顺序
select_type 查询类型
table 调用表
partitions 所使用的分区
type 连接类型
possible_keys 可能使用的索引
key 实际使用的索引
key_len 使用索引的长度
ref 与索引列比较的内容
rows 需要读取的数据行数
filtered 匹配记录占读取记录的百分比
extra 使用的子句

视图

视图是一个虚拟表,它并不在数据库中存储数据,而是存储一个查询语句。当我们对视图进行查询时,MySQL 会使用该查询语句来生成结果集。

创建视图

create view v_name as
# 查询语句

修改视图

alter view v_name as
# 查询语句

删除视图

drop view v_name;

视图的应用

视图的增删改查与数据表一致

Mysql编程

基础语法

变量的声明

set @var=1; # 会话变量
declare var int # 局部变量

其他内容

参考前面的部分

用户自定义函数

用户自定义函数有以下要求:

  • 必须返回一个值
  • 只能使用select语句返回值,不能用insertupdatedelete等修改表中的记录
创建/删除函数
create function func_name([p_name datatype,[...]]) returns datatype
begin
# 函数体
end;
drop function func_name;

实际上,MysqlUDF可以使用C\C++编写动态链接库,实现更底层与系统交互的功能

函数体的编写
declare v int # 声明变量
select 1 into v # 给变量赋值
return v # 返回值
函数的调用

函数可以在一个语句中的任何地方使用,构成表达式的一部分

编写一个简单的函数,求两数之和

create function sum(a int,b int) returns int
begin
declare result int
select (a+b) into result
end;

储存过程

储存过程时一段储存在数据库中的sql语句

创建/删除储存过程

create procedure proc_name([type p datatype,[...]])
# sql语句

触发器

应该不会考,自己查

用户权限管理

用户管理

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; # 创建用户
DROP USER 'newuser'@'localhost'; # 删除用户

权限管理

Mysql权限列表

  • 全局权限

  • ALL [PRIVILEGES]: 授予所有权限,等同于授予所有单独的权限。

  • GRANT OPTION: 允许用户授予自己拥有的权限给其他用户。

  • 数据库权限

  • CREATE: 允许创建数据库和表。

  • DROP: 允许删除数据库和表。

  • DELETE: 允许删除表中的记录。

  • INSERT: 允许向表中插入记录。

  • SELECT: 允许读取表中的数据。

  • UPDATE: 允许更新表中的记录。

  • INDEX: 允许创建和删除索引。

  • ALTER: 允许修改表结构。

  • CREATE TEMPORARY TABLES: 允许创建临时表。

  • LOCK TABLES: 允许使用 LOCK TABLES 语句。

  • REFERENCES: 允许创建外键(尽管 MySQL 目前并不严格检查这一点)。

  • SHOW VIEW: 允许执行 SHOW CREATE VIEW 命令。

  • CREATE VIEW: 允许创建视图。

  • ALTER ROUTINE: 允许修改或删除存储例程。

  • EXECUTE: 允许执行存储过程和函数。

  • 表权限
  • SELECT: 允许读取表中的数据。
  • INSERT: 允许向表中插入记录。
  • UPDATE: 允许更新表中的记录。
  • DELETE: 允许删除表中的记录。
  • CREATE: 允许创建表。
  • DROP: 允许删除表。
  • INDEX: 允许创建和删除索引。
  • ALTER: 允许修改表结构。
  • REFERENCES: 允许创建外键。

  • 列权限

  • SELECT: 允许读取表中特定列的数据。
  • INSERT: 允许向表中特定列插入数据。
  • UPDATE: 允许更新表中特定列的数据。

  • 存储过程和函数权限

  • EXECUTE: 允许执行存储过程和函数。
  • ALTER ROUTINE: 允许修改或删除存储例程。

  • 高级权限

应该用不到

权限管理

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION; # 全局权限
GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'username'@'localhost'; # 数据库级别权限
GRANT SELECT, INSERT ON mydatabase.mytable TO 'username'@'localhost'; # 表级别权限
GRANT SELECT (col1, col2), INSERT (col3) ON mydatabase.mytable TO 'username'@'localhost'; # 列级别权限
FLUSH PRIVILEGES; # 刷新权限
show grants for 'user'@'localhost'; # 查看用户权限