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 数据表是用来存储数据的基本结构,它由列和行组成,每列代表一个字段,每行代表一条记录。数据表是数据库中的核心组成部分,用于组织和存储数据,以便进行查询、插入、更新和删除操作。
表的基本组成
数据类型
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
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
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
语句返回值,不能用insert
、update
、delete
等修改表中的记录
创建/删除函数
create function func_name([p_name datatype,[...]]) returns datatype
begin
# 函数体
end;
drop function func_name;
实际上,Mysql
的UDF
可以使用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'; # 查看用户权限