上传部分Mysql

This commit is contained in:
jimmy committed 2025-01-19 12:20:02 +08:00
1 parent e2921c8347
commit 51aa7a3502
51 files changed
+682 -17

No files matched your search

+2 -2
View File
@@ -97,12 +97,12 @@ function divideSidebar (
let file = files[i]
// 如果有子项目,则该级别无链接
if (file.type === 'file') {
let fileName = FileUtils.getFileName(file.path)
let fileName = FileUtils.removeExtension(FileUtils.getFileName(file.path))
// 是否为 index 文件【index 跳过】
if (fileName.includes('index')) continue
let lastFolderName = FileUtils.getLastFolderName(file.parentFolder)
let relativePath = FileUtils.getRelativePath(file.path, rootDir)
let relativePath = FileUtils.removeExtension(FileUtils.getRelativePath(file.path, rootDir))
let obj: SidebarItem = {
text: fileName,
link: relativePath,
+9
View File
@@ -65,6 +65,15 @@ export class FileUtils {
return '';
}
}
/**
* 去除后缀名
* @param filename
*/
static removeExtension(filename:string) {
return filename.slice(0, filename.lastIndexOf('.')) || filename;
}
}
//
// // /home/runner/work/duyl328.github.io/duyl328.github.io/docs/notes/index.md
+46 -12
View File
@@ -5,28 +5,62 @@ export default {
"collapsed": true,
"items": [
{
"text": "01JDBC介绍.md",
"link": "notes/JDBC/01JDBC介绍.md"
"text": "01JDBC介绍",
"link": "notes/JDBC/01JDBC介绍"
},
{
"text": "02JDBC体系结构.md",
"link": "notes/JDBC/02JDBC体系结构.md"
"text": "02JDBC体系结构",
"link": "notes/JDBC/02JDBC体系结构"
},
{
"text": "03获取连接.md",
"link": "notes/JDBC/03获取连接.md"
"text": "03获取连接",
"link": "notes/JDBC/03获取连接"
},
{
"text": "04查询结果集.md",
"link": "notes/JDBC/04查询结果集.md"
"text": "04查询结果集",
"link": "notes/JDBC/04查询结果集"
},
{
"text": "05PreparedStatement.md",
"link": "notes/JDBC/05PreparedStatement.md"
"text": "05PreparedStatement",
"link": "notes/JDBC/05PreparedStatement"
},
{
"text": "06事务与锁.md",
"link": "notes/JDBC/06事务与锁.md"
"text": "06事务与锁",
"link": "notes/JDBC/06事务与锁"
}
]
},
{
"text": "MySql",
"collapsed": false,
"items": [
{
"text": "01概述",
"link": "notes/MySql/01概述"
},
{
"text": "02MySql的卸载与密码修改",
"link": "notes/MySql/02MySql的卸载与密码修改"
},
{
"text": "03常用指令与数据导入",
"link": "notes/MySql/03常用指令与数据导入"
},
{
"text": "04简单查询",
"link": "notes/MySql/04简单查询"
},
{
"text": "05条件查询",
"link": "notes/MySql/05条件查询"
},
{
"text": "06数据排序",
"link": "notes/MySql/06数据排序"
},
{
"text": "07函数",
"link": "notes/MySql/07函数"
}
]
}
@@ -1,6 +1,4 @@
<template>
<h1>无内容</h1>
</template>
<template></template>
<script setup lang="ts">
import { useRouter } from 'vitepress'
import autoSidebar from '../../autoSidebar'
+73
View File
@@ -0,0 +1,73 @@
## sql、DB、DBMS分别是什么,他们之间的关系?
DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:
DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)
## SQL:
结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
DBMS -(执行)-> SQL -(操作)-> DB
增删改查术语:
CRUD操作。
Create Retrieve Update Delete
## 什么是表?
表:table
表:table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强。
任何一张表都要有行和列
一个表包括行和列:
行:被称为数据/记录(data)
列:被称为字段(column)
------------------------------------
| 学号(int) | 姓名(varchar) | 年龄(int) |
|---------|-------------|---------|
| 110 | 张三 | 20 |
| 120 | 李四 | 21 |
表中的每个数据都是一个记录;表头称为字段
每一个字段都有数据类型;数据也可以有数据类型和约束。
每一个字段应该包括哪些属性?
字段名、数据类型、相关的约束。
## SQL
DQL(数据查询语言): 查询语句,凡是select语句都是DQL。
DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言):create drop alter,对表结构的增删改。
TCL(事务控制语言):commit 提交事务,rollback 回滚事务。(TCL中的T是Transaction)
DCL(数据控制语言): grant 授权、revoke 撤销权限等。
@@ -0,0 +1,108 @@
## 卸载MySQL
1. 双击安装包,点击下一步,然后点击remove。卸载。
2. 手动删除Program Files中的MySQL目录。
3. 手动删除ProgramData目录(这个目录是隐藏的。)中的MySQL。
## 修改mysql的root密码
### 方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:
```sql
mysql> set password for 用户名@localhost = password('新密码');
```
例子:
```sql
mysql> set password for root@localhost = password('123');
```
### 方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:
```sql
mysqladmin -uroot -p123456 password 123
```
### 方法3:用UPDATE直接编辑user表
首先登录MySQL。
```sql
mysql> use mysql;
mysql> update user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;
```
### 方法4:在忘记root密码的时候,可以这样
以windows为例:
1. 关闭正在运行的MySQL服务。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
7. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
8. 刷新权限(必须步骤):flush privileges; 。
9. 退出 quit。
10. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
## MySQL的启停
```shell
Net stop 服务名称
```
```shell
Net start 服务名称
```
## 登录MySQL
使用bin目录下的mysql.exe命令来连接服务器
![显式密码输入](../../public/note/MySql/MySql%E7%9A%84%E5%8D%B8%E8%BD%BD%E4%B8%8E%E5%AF%86%E7%A0%81%E4%BF%AE%E6%94%B9/img-1.png)
本地登录(隐藏密码形式):
![隐式密码输入](../../public/note/MySql/MySql%E7%9A%84%E5%8D%B8%E8%BD%BD%E4%B8%8E%E5%AF%86%E7%A0%81%E4%BF%AE%E6%94%B9/img-2.png)
@@ -0,0 +1,54 @@
## 常用命令
退出MySQL:exit;
查看数据库哪些数据库:show databases;
MySQL 默认带了4个数据库
使用数据库:use 数据库名;
表示正在使用指定数据库
创建数据库:Create database 数据库名;
查看一个库下有多少个表:show tables;
不看表中的数据,只看表中的结构:desc 表名;
![img-1.png](../../public/note/MySql/%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/img-1.png)
varchar就是Java中的string
查看当前使用哪个数据库:select database();
删除数据库:drop database 数据库名;
结束一条语句:\c(但是符号没有配对的语句不会被结束)
![img-2.png](../../public/note/MySql/%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/img-2.png)
查看使用的MySQL的版本号:select version();
查看创建表时使用的语句:show create table 表名;
![img-3.png](../../public/note/MySql/%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/img-3.png)
## 导入数据
Source 指定路径 的文件:
Source 指定路径文件名;
![img-4.png](../../public/note/MySql/%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/img-4.png)
> [!TIP]
> 路径中不能有中文!!
查看表中数据:select * from 表名
![img-5.png](../../public/note/MySql/%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/img-5.png)
+25
View File
@@ -0,0 +1,25 @@
## 简单查询(DQL)
语法格式:select 字段名1 ,字段名2 ,字段名3,。。。From 表名;
任何一个sql语句都是 ’ ;‘结尾。
sql语句不区分大小写。
字段可以参与数学运算。
查询员工年薪;(员工薪资使用月薪表示,可以使用简单的运算得到)
![img.png](../../public/note/MySql/%E7%AE%80%E5%8D%95%E6%9F%A5%E8%AF%A2/img.png)
给查询后的结果的列重命名;
![img_1.png](../../public/note/MySql/%E7%AE%80%E5%8D%95%E6%9F%A5%E8%AF%A2/img_1.png)
![img_2.png](../../public/note/MySql/%E7%AE%80%E5%8D%95%E6%9F%A5%E8%AF%A2/img_2.png)
> [!TIP]
> 【MySQL中中文字符可以使用单引号和双引号就可以,但是为了考虑兼容性,统一使用单引号(一些数据库不支持双引号)】
![img_3.png](../../public/note/MySql/%E7%AE%80%E5%8D%95%E6%9F%A5%E8%AF%A2/img_3.png)
as关键字可以省略
+83
View File
@@ -0,0 +1,83 @@
## 条件查询
语法:
Select
字段1,字段2,,,,
From
表名
Where
条件;
执行顺序: from —> where —> select
![img.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img.png)
查询工资等于5000 的员工姓名;
查询SMITH 工资;
![img_1.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_1.png)
查工资大于3000的员工;
查询工资大于等于3000的员工;
![img_2.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_2.png)
不等于:!= 或<>
工资在1100在3000之间的工资;(两种写法)
![img_3.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_3.png)
## Between ... and
between是属于闭区间,会将等于指定的值也返回【等同于>= and <=】
查询的时候必须是左小右大,不然查询不到任何数据
并且 between…and 不仅适用数字,也适用与字符串
![img_4.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_4.png)
当使用在字符上时,符合左闭右开原则
## Is null
在数据库中NULL不是一个值,代表什么也没有,为空。
NULL 不等同于 0.00
所以NULL也不能使用 = 进行衡量【因为null是一个值】
必须使用is null 或 is not null
找出那些人为NULL;
![img_5.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_5.png)
## Or 和 and 的优先级
and和or中,and的优先级更高,两个条件在一起时会优先通过and进行连接
查询职位编号(detpno)是20和30 并且 工资在3000以上的员工名单;
![img_6.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_6.png)
使用括号提高优先级。
## In,not in
in和or效果相同
![img_7.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_7.png)
并且效率一样
in后面的值不是区间,而是一个具体的值。
Not in
![img_8.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_8.png)
## 模糊查询 like
查询名字中含有‘ o ’ 的;
% : 代表任意多个字符
_:代表任意一个字符
找出名字中含有字母o的:
![img_9.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_9.png)
找出第二字母是A的;
![img_10.png](../../public/note/MySql/%E6%9D%A1%E4%BB%B6%E6%9F%A5%E8%AF%A2/img_10.png)
找出名字中有下划线的;
使用转义字符 ‘ \ ’
+69
View File
@@ -0,0 +1,69 @@
## 排序
语法:
```sql
Select 字段1,字段2,,, Form 表名 Order by 要排序的字段
```
不指定排序方式时,默认升序排列
asc表示升序,desc表示降序
按照工资升序排
![img.png](../../public/note/MySql/%E6%95%B0%E6%8D%AE%E6%8E%92%E5%BA%8F/img.png)
按照工资降序排列,当工资相同时按照名字升序排列;
![img_1.png](../../public/note/MySql/%E6%95%B0%E6%8D%AE%E6%8E%92%E5%BA%8F/img_1.png)
当多个条件时,使用逗号进行间隔;第一个条件优先级最高,然后一次递减,只有当第一个条件无法排序时才是向下继续寻找条件,后面的条件也可能压根用不上。
找出岗位是salesman的员工,并按照工资降序排列;
![img_2.png](../../public/note/MySql/%E6%95%B0%E6%8D%AE%E6%8E%92%E5%BA%8F/img_2.png)
## SQL语句执行顺序
```sql
Select 字段 Form 表名 Order by 。。。
```
先执行from再where,然后select,最后排序
排序是最后执行的
![img_3.png](../../public/note/MySql/%E6%95%B0%E6%8D%AE%E6%8E%92%E5%BA%8F/img_3.png)
这里将工资改为年薪,并且排序后输出;
在排序时使用的更改的别名,这么就说明在排序前就已经进行了更改了别名;反之,如果先排序那么不会找到这个别名。
故,说明排序是在最后执行的
+204
View File
@@ -0,0 +1,204 @@
## 分组函数(多行处理函数)
多行处理函数特点:输入多行,输出结果是一行
select后只能跟:参加分组的字段,以及分组函数,其他的一律不能跟
所有分组函数自动忽略NULL!!!!!!!!!!!
| Count | 计数 |
|-------|-----|
| Sum | 求和 |
| Avg | 平均值 |
| max | 最大值 |
| Min | 最小值 |
所有的分组函数都是对‘某一组数据’进行操作的。
1. 找出工资总和
2. 找出最高工资
3. 找出最低工资
4. 找出平均工资
![img.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img.png)
找出总人数
![img_1.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_1.png)
![img_2.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_2.png)
分组函数自动忽略NULL。
![img_3.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_3.png)
### Count * 和count(具体字段)的区别
Count * :统计的一定是这个表中数据的总条数【和某个字段无关】
Count (具体字段):一定是将NULL排除在外再进行统计的
![img_4.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_4.png)
分组函数的组合使用:
![img_5.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_5.png)
## Group by 和where的执行顺序
找出比平均工资高的员工;
```sql
mysql> select avg((sal + comm)*12) from emp;
+----------------------+
| avg((sal + comm)*12) |
+----------------------+
| 23400.000000 |
+----------------------+
1 row in set (0.00 sec)
mysql> select ename ,sal from emp where sal>avg((sal+comm)*12);
ERROR 1111 (HY000): Invalid use of group function
```
这么写似乎没有问题,但是语法上会出错【无效使用了分组函数】
> 因为SQL语句中有一个语法规则,分组函数不能直接使用在where子句中。
为什么不能?
> 分组函数 是在分完组之后( group by函数)后再执行的,即使没有分组,那整个表也会自成一组;
> 在where之后才会进行分组(group by),分组后才能使用分组函数
> 所以,没有分组不能使用分组函数 字段执行顺序
最终解决:使用子查询;
![img_6.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_6.png)
### Group by和 having
Group by:按照某个字段或者某些字段进行分组
having:having 是对分组之后数据进行再次过滤
Having不能单独使用,必须配合Group by
> 优化策略:where和having优先选择where,where是在完成不了,再使用having
语法格式:
```sql
Select 要找的东西(一般是分组函数或字段名) From 表名 Group by 分组字段
```
先按照分组字段进行分组,再求最大值【分组函数永远在group by之后执行】
分组函数一般和group by联合使用,这也是为什么他会被称为分组函数的原因。
并且任何一个分组函数(count 、sum、avg、max、min)都是在group by函数执行结束后才会执行的,当一个SQL语句中没有group by语句时,整个表自成一组。
找出每个岗位的最高薪资;
![img_7.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_7.png)
## 单行处理函数
输入一行,输出一行
If null()就是单行处理函数
单行处理函数处理一条返回一条,所以通常是多条返回的,而单行无论是多少行处理,返回的只会是一行
## NULL的运算处理
计算每个员工的年薪;
![img_8.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_8.png)
有 NULL 参加的运算,结果是 NULL
数据库规定:在一个式子中,无论最后结果如何,只要式子中有一个元素是NULL,那么结果一定是 NULL
解决方式:
 if null() 空处理函数
语法:if null(可能是NULL的数据 , 被当作什处理)
![img_9.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_9.png)
当sal是NULL时,将NULL当0处理,并进行计算
多行处理函数如何处理NULL
![img_10.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_10.png)
因为运算中有NULL返回值一定NULL,但是多行处理时,返回结果并不是NULL。
故,多行处理函数会自动忽略NULL
## 多字段分组查询
当一个语句使用 group by 语句的话,select 后面只能跟分组函数和参与分组字段。
![img_11.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_11.png)
在其他的数据库中违反这个可能有数据,但是没有意义
当多个字段联合分组时,将两个字段关键字使用逗号进行间隔,这样两个字段会进行联合分组。
找出不同部门(dtptno)每个工作岗位(job)的最高薪资;
找出不同部门每个工作岗位的最高薪资;
![img_12.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_12.png)
## Having
找出每个部门的最高薪资,要求显示薪资大于2500的数据;
![img_13.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_13.png)
先找出数据中薪资最高的,再将薪资大于 3000 的进行呈现,但是这种方式有运算完舍弃的数据,所以效率较低,不建议。
![img_14.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_14.png)
> 在这里使用 where,进行筛选后再进行排序,效率更高【能使用where做的就是用where】
找出每个部门的平均薪资,要求平均薪资大于2000的;
## 各个关键字执行顺序
```sql
Select
...
Form
...
Where
...
Group by
...
Having
...
Order by
...
```
先执行 from,表中数据导入;
再执行 where,经过条件过滤;
再执行 group by,将数据分组;
再执行 having,进行过滤;
再执行 select,将数据查出来;
最后执行 order by,进行排序输出;
> [!TIP]
> 在where之后才会进行分组(group by),分组后才能使用分组函数
## 查询结果的去重
Distinct —> 有差距的,有差异的
> [!TIP]
> distinct 只能出现在所有字段的最前方
这个关键字可以去除重复的记录
![img_15.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_15.png)
distinct出现在字段最前方指的是字段联合去重
![img_16.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_16.png)
计算岗位数量
![img_17.png](../../public/note/MySql/%E5%87%BD%E6%95%B0/img_17.png)
+8
View File
@@ -0,0 +1,8 @@
# MySql
### 简介
### 目录
Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB