mysql基础

压测

安装mysql(docker)

Mysql - 官方图片|Docker Hub

拉取镜像

1
2
docker pull mysql:5.7
# docker pull mysql:[tag]

运行

1
2
3
4
5
6
docker run --name [name] -e MYSQL_ROOT_PASSWORD=[password] -d -p 3306:3306 mysql:[tag]
# 看这里-d -p -v --name -e --network
挂载数据卷
/var/lib/mysql/ # data
/etc/mysql/ # config
/var/log/mysql/ # logs

基本操作

show查看

1
2
3
4
5
6
7
8
# 查看所有数据库
show databases;
# 查看所有表
show tables;
# 查看数据库创建语句
show create database [database];
# 查看表创建语句
show create table [table];

use切换数据库

1
use [database];

create创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create database [options] [table] [列];
# option:
if not exists
# 例子
create table if not exists users(
id int(4) not null auto_increment comment 'id',
name varchar(30) not null default 'name' comment 'name',
birthday datetime default null comment 'birthday',
email varchar(50) default null comment 'email',
primary key(id)
)engine=innodb default charset=utf8;
# 列属性
[name] [看例子]
option:
not null # 非空
default ['value'] # 默认值(可为null)
auto_increment # 自增
comment 'value' # 注释

desc显示表的结构

1
desc [table]

alter修改

1
2
3
4
5
6
7
8
9
10
# 修改表名
alter table [table] rename as [new table];
# 增加表的字段
alter table [table] add [列名] [列属性];
# 修改约束
alter table [table] modify [列名] [列属性];
# 重命名
alter table [table] change [列名] [新列名] [列属性];
# 删除
alter table [table] drop [列名];

drop删除

1
2
3
4
5
6
# 删除数据库
drop database [options] [database];
# 删除表
drop table [options] [table];
# option:
if exists

基本数据类型

整数

  • tinyint 1字节
  • smallint 2字节
  • mediumint 3字节
  • int 4字节
  • bigint 8字节

小数

  • float 4字节
  • double 8字节
  • decimal 高精度

字符串

  • char 255
  • varchar 65535
  • tinytext 2^8-1
  • text 2^16-1

时间

  • data YYYY-MM-DD
  • time HH:mm:ss
  • datatime YYYY-MM-DD HH:mm:ss
  • timestamp 1970.1.1到今毫秒
  • year 年

增删改查

1
2
3
4
# 插一个(列名不写就是全部)
insert into [table]([列名]) values ('[value]');
# 插多个
insert into [table]([列名1],[列名2]) values ('[value1]','[value2]'),('[value1]','[value2]');

1
2
3
4
# 删一个
delete from [table] where [自行判断];
# 清表
truncate [table];

1
2
3
update [table] set [设置的值] where [自行判断]
# 设置的值:
[列名]=[value] # 多个用逗号隔开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
select [distinct去重] [表达式] from [table] [连接表] where [自行判断] group by [列名] having [自行判断] order by [列名] [asc/desc] limit [起始行] [显示行];
# 表达式
* # 全部
[列名] # 多个逗号隔开
[表达式] as [别名] # 起别名
current_data() # 获取当前日期
now() # 获取当前日期+时间
localtime() # 本地日期+时间
sysdate() # 系统时间
year(now()) # 获取年,类推月日时分秒
user() 或 system_user() # 用户
version() # 版本
concat([表达式],[表达式])# 字符串拼接(支持多个)
abs([表达式]) # 绝对值
ceiling([表达式]) # 向上取整
floor([表达式]) # 向下取整
rand() # 0~1随机数
sign([表达式]) # -1,0,1返回符号
char_length([表达式]) # 字符串长度
insert() # 插入 用到再查
lower([表达式]) # 转小写
upper([表达式]) # 转大写
instr([表达式],[表达式]) # 第一次出现索引
replace() # 替换 用到再查
substr() # 截取 用到再查
reverse() # 反转 用到再查
# 连接表
inner join [table] # 表中至少一个匹配,返回行
right join [table] # 返回右表值,即使左表没有
left join [table] # 返回左表值,即使右表没有
# 例子 (on 或 where) [s.no] = [r.no]
# order by
asc # 升序
desc # 降序

聚合函数(select后)

1
2
3
4
5
count([表达式]) # 表达式: *或1 不忽略null 列名忽略null
sum([列名]) # 总和
avg([列名]) # 平均分
max([列名])
min([列名])

where

  • =
  • <> 或 !=
  • ‘>=
  • <
  • ‘>=
  • <=
  • and 或 &&
  • or 或 ||
  • not 或 !
  • [value] is null 分割 [value] is not null
  • [value] between [value] and [value]
  • [value] like [value] // %任意不限长度 _任意单字符
  • [value] in [value]

事务没啥必要看一乐吧

1656853152683

mysql编程没啥必要看一乐吧

1656856342909

数据库备份

导出

1
mysqldump -h[ip] -uroot -p[password] [database] [table] >d:/a/a.sql

导入

1
source [path];

JDBC(嘎嘎重要)(经典白学,年轻人啊)

connection连接数据库

1
2
3
4
5
6
7
String url = "jdbc:mysql://49.232.139.28:3306/website?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "password";

// connection代表数据库
Connection connection = DriverManager.getConnection(url,username,password);

statement执行类(sql注入,不安全)

1
2
3
4
5
6
// 连接
Statement statement = connection.createStatement();

statement.executeQuery(); // 查询
statement.execute(); // 通用
statement.executeUpdate(); // 更新插入删除

prepareStatement执行类(嘎嘎安全)

创建

1
2
3
4
5
6
// 创建
PrepareStatement [prepareStatement] = [connection].prepareStatement([sql语句]);
// sql:问号占位
例:"insert into user(name) values (?)"
// 返回sql时间
(new java.sql.Date(new Date().getTime))

传参

1
2
3
4
5
[prepareStatement].setObject([index],[value]);
[prepareStatement].setInt([index],[value]);
[prepareStatement].setString([index],[value]);
// set[xxx]类推Float,Date等等
// index从1开始

执行

1
2
3
4
5
6
7
8
[prepareStatement].executeUpdate(); // 更新
[prepareStatement].execute(); // 通用
[prepareStatement].executeQuery(); // 查询
// 返回值类型int,代表受影响行数
int i = [上面那玩应];
if (i > 0) {
sout("成功");
}

resultSet接收返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 例子
ResultSet resultSet = statement.executeQuery(sql);

// 接收表类型(数组)
resultSet.getObject(); // 未知
resultSet.getString(); // 字符串
resultSet.getInt(); // 整形
还有Float,Date,等等

// resultSet读取值
resultSet.beforeFirst(); // 到最前面
resultSet.afterLast(); // 到最后面
resultSet.next(); // 下一个
resultSet.previous(); // 上一个
resultSet.absolute([row]); // 到指定行

释放资源

主从复制