Mysql的学习笔记
一、数据库概述
1、 概述
- 数据库:Database , 简称DB。是指按照一定格式存储数据的一些文件的组合(数据仓库)
- 数据库管理系统:DataBaseManagement , 简称DBMS,用来管理数据库中的数据的。可以对其中的数据进行增删改查。
- 常见的数据库管理系统:MySQL 、 Oracle、MS SqlSever 、 DB2 、sybase等
- SQL:是一种结构化查询语言通过编写SQL语句,由DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查(相当于编程语言)
- 关系:DBMS -----> 通过执行SQL语句操作数据库中的数据
- CRUD : 增删改查,对应 create 、retrave(查,检索)、update 、 delete ;
2、 安装MySQL
-
免安装版:
- 第一步:去官网下载安装
- (重点)第二步:先解压,然后在mysql下创建一个my.ini文件,
更改my.ini文件里面的两行安装目录,
第二行加上\data,my.ini文件不能多或少一个符号,
在path(环境变量里面)加上mysql路径(/bin)。 - (重点)第三步:进入命令指示符(cmd),
输入mysqld --initialize-insecure --user=mysql,
再输入mysqld -install,
出现Service successfully installed.表示配置完成
启动数据库net start mysql,
输入mysql -u root -p,不用输入密码直接回车
出现mysql>表示配置完成
输入alter user user() identified by “密码”;
输入net stop mysql关闭数据库
-
安装版(msi):
- 注意事项
- 1、端口号:是任何一个软件都会有的,端口号是一个软件的唯一代表。通常和ip地址在一起。ip地址用来定位计算机,port端口号是用来定位计算机上的服务/应用的。在同一台计算机上,端口号不能重复,具有唯一性。 MySQL占用的默认端口号3306
- 2、字符集(字符编码方式):设置MySQL的字符编码方式为UTF - 8
- 3、服务名称:默认是MySQL
- 4、环境变量path
- 5、MySQL超级管理员root名称不变,设置密码
- 6、设计密码的同时,可以激活root账户远程访问。激活后,root账户可以从外地登录访问;不激活则表示root账户只能在本地使用
- 注意事项
3、 MySQL的卸载
-
免安装版:
- 第一步:停止mysql服务
net stop mysql - 第二步:卸载mysql
- 第三步:删除mysql服务
sc delete mysql(服务名称)- 如果服务删除不了,就从注册表删除
win+R:regedit打开注册表
HEKY_LOCAL_MACHINE-SYSTEM-CurrentControlSet-Service
找到mysql服务删除即可
- 如果服务删除不了,就从注册表删除
- 第四步:环境变量删除
- 第一步:停止mysql服务
-
安装版(msi):
- 第一步:双击安装包卸载
- 第二步:删除目录(表层位置,C盘的ProgramDate文件下的MySQL目录一起删掉)
- 第三步:环境变量删除
4、计算机中MySQL的服务
- 流程:计算机右键 — 管理 — 服务和应用程序 — 服务 — 找MySQL服务
- MySQL的服务默认为启动, 默认为自动启动,表示启动操作系统的时候自动启动
Windows 系统中的启动方式
net start MySQL // 启动MySQL服务
net stop MySQL // 关闭MySQL服务
5、如何登录MySQL服务(客户端)
使用bin目录下的mysql.exe命令来连接mysql数据库服务器
-
第一步:启动MySQL服务
-
第二步:mysql -u 用户名称 -p密码 (其中的-u 表示user , -p表示passward)
-
本地登录(显示密码的形式)
C:\Users\张中宇>mysql -u root -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.18 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
-
本地登录(隐藏密码的形式)
C:\Users\张中宇>mysql -u root -p Enter password:****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.18 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
二、基础命令
1、登录与退出
mysql -u root -p // 本地登录
exit // 退出
\q // 退出
2、MySQL的常用命令
(命令不区分大小写)(mysql不见分号不执行)
show databases; // 查看mysql中有哪些数据库(默认自带4个)
use 数据库名称 ; // 使用某一个数据库
create database 数据库名称 ; // 创建一个新的数据库
show tables ; // 查看数据库下有哪些表
source + 文件路径 // 导入sql文件
select * from 表名 ; // 查看表中的数据
desc(describe) 表名 ; // 不看表的数据,只看表的结构
select version() ; // 查看mysql数据库的版本号
select database(); // 查看当前使用的数据库
\c // 中止命令的输入
三、数据库基本知识
1、表(table)
- 概念:类似于Excel
- 表是数据库中最基本的单元,数据库中以表的是形式表示数据;因为表比较直观
- 任何表都有行和列
- 行(row , 被称为数据或者记录)
- 列(column ,被称为字段)
- 每个字段都有字段名、数据类型(字符串、数字、日期等)、约束(限制性措施)等属性
2 、SQL语句的分类
- 分为DQL、DML、DDL、TCL、DCL
- DQL : 数据查询语言,关键字SELECT
- DML:数据操作语言,对表中的数据进行增删改的 关键字INSECT;DELETE; UPDATE
- DDL:数据定义语言,主要操作的是表的结构,增删改 关键字CREATE、DROP、ALTER
- TCL:事务控制语言:事务提交、事务回滚 关键字COMMIT 、 ROLLBACK
- DCL:数据控制语言:授权、撤销权限 关键字GRANT、REVOKE
3、数据的导入
- source + 文件目录
- 注意:文件的路径一定不要有中文!!!!
mysql> source D:\MySQL\sql-documents\pre\bjpowernode.sql
Query OK, 0 rows affected, 1 warning (0.43 sec)
Query OK, 0 rows affected, 1 warning (0.01 sec)
Query OK, 0 rows affected, 1 warning (0.01 sec)
Query OK, 0 rows affected, 1 warning (0.63 sec)
Query OK, 0 rows affected, 5 warnings (0.38 sec)
Query OK, 0 rows affected (0.14 sec)
Query OK, 1 row affected (0.15 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.03 sec)
Query OK, 1 row affected (0.12 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.04 sec)
mysql> select * from emp
-> ;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
mysql> select * from salgrade;
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)
4、表的结构
-
不看表内容 , 只看表的结构 desc + 表名 ;
-
mysql> desc dept; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | DEPTNO | int(2) | NO | PRI | NULL | | 部门编号 | DNAME | varchar(14) | YES | | NULL | | 部门名称 | LOC | varchar(13) | YES | | NULL | | 地理位置 +--------+-------------+------+-----+---------+-------+ 3 rows in set (0.15 sec) mysql> desc emp ; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | EMPNO | int(4) | NO | PRI | NULL | | 员工编号 | ENAME | varchar(10) | YES | | NULL | | 员工姓名 | JOB | varchar(9) | YES | | NULL | | 工作岗位 | MGR | int(4) | YES | | NULL | | 上级编号 | HIREDATE | date | YES | | NULL | | 入职日期 | SAL | double(7,2) | YES | | NULL | | 工资 | COMM | double(7,2) | YES | | NULL | | 补助 | DEPTNO | int(2) | YES | | NULL | | 部门编号 +----------+-------------+------+-----+---------+-------+ 8 rows in set (0.00 sec) mysql> desc salgrade ; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | GRADE | int(11) | YES | | NULL | | 工资等级 | LOSAL | int(11) | YES | | NULL | | 最低工资 | HISAL | int(11) | YES | | NULL | | 最高工资 +-------+---------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
5、MySQL常用命令
- 详情参见第二部分
四、常用命令
1、DQL语句
1.1 SELECT语句
- 注意:select语句不会更改原表之中的任何内容,只负责检索、查询
- select 后面可以跟字段名(自变量) , 也可以跟字面量/ 字面值(数据)
- 如果select后面跟的是字段名,那么查询字段
- 如果跟的是数据,那么会借助这个表的结构, 形成这个数据表
1.1.1 简单查询
select 字段名 from 表名 ; // 查询一个字段
select 字段名1,字段名2,... from 表名; // 查询多个字段
select * from 表名 ; // 查询所有字段(效率低、可读性差)
select 字段名 as 新字段名 from 表名; // 给查询的列起别名
/*注意:只是将列名的显示改为新的名称,原表不变。select语句不会更改原表之中的任何内容
as可以省略,但只能显示一个字符。
假设起别名是有空格,加上单引号
字符串用单引号标起来(标准),双引号在oracle数据库中无法使用
在列之中的字段可以使用数学表达式
别名是中文,属于字符串,用单引号括起来即可*/
1.1.2 条件查询
- 查询出来符合条件的
- 格式 : select 字段名1 , 字段名2 , 字段名3 … from 表名 where 条件 ;
- 条件查询的条件:
- = \ <>或 != \ < \ <= \ > \ >= \ between…and … \ is null \ and \ or \ in \ not \ like \ % \ _
1、 = 等于
【案例】:查询薪资等于800的员工的姓名和编号
select empno,ename from emp where sal=800 ;
2、<> 或 != 不等于
【案例】:查询薪资不等于800的员工的姓名和编号
select empno,ename from emp where sal<>800 ;
select empno,ename from emp where sal!=800 ;
3、< 小于
【案例】:查询薪资小于2000的员工的姓名与编号
select empno,ename from emp where sal<2000 ;
4、<= 小于等于
【案例】:查询薪资小于3000的员工的姓名与编号
select empno,ename from emp where sal<=3000 ;
5、> 大于
【案例】:查询薪资小于2000的员工的姓名与编号
select empno,ename from emp where sal>4000 ;
6、>= 大于等于
【案例】:查询薪资小于2000的员工的姓名与编号
select empno,ename from emp where sal>=4000 ;
7、between... and... 两个值之间,等同于 >= and <=
注意:使用此语句时必须保证左小右大 , 闭区间,包含两端的值
【案例】:查询薪资小于2000的员工的姓名与编号
select empno,ename from emp where sal between 2000 and 4000 ;
select empno,ename from emp where sal >= 2000 and sal <= 4000 ;
8、is (not) null
【案例】:查询津贴(补助)(不)为null的员工姓名和员工编号
select empno,ename from emp where comm is null;
select empno,ename from emp where comm is not null ;
9、and 并且
【案例】:查询工作岗位是manager并且工资大于2500的员工信息
select * from emp where job = 'manager' and sal > 2500 ;
10、or 或者
【案例】:查询工作岗位是manager或者是salesman的员工信息
select * from emp where job = 'manager' or job = 'salesman';
【注意】:and 和or 同时出现,and 优先级高 , 先执行and。
【语句】: select * from emp where sal > 2500 and deptno = 10 or deptno = 20 ;
表达的意义是工资大于2500并且dept = 10 的人,或者是deptno = 20 的所有人
select * from emp where sal > 2500 and (deptno = 10 or deptno = 20) ;
表达的意义是工资大于2500的人,同时是dept = 10 或者deptno = 20 的所有人
11、(not) in 包含,相当于多个or
【案例】:查询工作岗位是manager或者是salesman的员工信息
select * from emp where job in ('manager', 'salesman');
【注意】:in后面是具体的值,不是区间
12、not not 可以取非 , 主要用在is和in之中
13、like like称为模糊查询,支持% 或者_匹配
% 匹配任意个字符
_ 一个下划线只匹配一个字符
【案例】: 找出姓名中含有'o'的员工信息
select * from emp where ename like '%o%' ;
【案例】:找出姓名中以T结尾的
select * from emp where ename like '%t';
【案例】:找出姓名以k开始的
select * from emp where ename like 'k%';
【案例】:找出姓名第二个字母是A的
select * from emp where ename like '_a%';
【案例】:找出第三个字母是r的
select * from emp where ename like '__r%';
【案例】:找出名字中含有下划线的
select * from emp where ename like '%\_%'; // 反斜杠代表转义, 类似于转义字符
1.1.3 排序
- 格式 : select 字段名1 , 字段名2 , 字段名3 … from 表名 order by 字段名 ;(默认升序排列)
- 格式: select 字段名 from 表名 where 条件 order by 排序方式 ;
【案例】:查询所有员工薪资
select ename , sal from emp order by sal ; // 默认升序
select ename , sal from emp order by sal asc ; // 指定升序排列
select ename , sal from emp order by sal desc ; // 指定降序排列
【案例】:按照员工名字和薪资排列,按照薪资升序排列,如果相同按照姓名升序排列
select ename , sal from emp order by sal asc , ename asc ; // 多字段排序
【案例】:按照查询结果的第二列排列
select ename , sal from emp order by 2 ; // 不建议,因为不健壮
【案例】:找出工资在1250到3000之间的员工信息,按照薪资的降序排列
格式: select 字段名 from 表名 where 条件 order by 排序方式 ;
select ename , sal from emp where sal between 1500 and 3000 order by sal desc ;
1.1.4 数据处理函数
-
数据处理函数又被称为单行处理函数
-
特点:一个输入对应一个输出
函数名 函数功能 lower 转换小写 upper 转换大写 substr 取子串(substr(被截取的字符子串,起始下标,截取的长度)) length 取长度 trim 去空格 str_to_date 将字符串转换成日期 date_format 格式化日期 format 设置千分位 round 四舍五入 rand() 生成随机数 ifnull 可以将null转换成一个具体值
// 单行处理函数
1、lower / upper 转换大小写
【案例】:将员工姓名转换成小写
select lower(ename) from emp ;
2、substr 取子串
【格式】:substr(字符串 , 起始下标 , 截取长度) 起始下标从1开始
【案例】:请找出员工名字第一个字母是A的员工信息
select ename from emp where ename like 'a%' ;
select ename from emp where substr(ename , 1 1) = 'A' ; // 注意是一个等号
3、length
【格式】:length(字段名)
【案例】:求取员工姓名的长度,并更名为enamelength
select length(ename) as enamelength from emp ;
4、trim 去空格
【格式】: select 字符段 from 表名 where 字符段 = trim('传过来的数据');
【案例】: 查询king的数据
select * from emp where ename = trim(' king ');
5、str_to_date 将字符串varchar转换成date 类型
【格式】:str_to_date('字符串日期' , '日期格式') ;
日期格式:年月日时分秒分别为: %Y , %m , %d , %h , %i , %s ;
【案例】:向t_user表中插入一个数据,将字符串类型转换成日期类型
insert into t_user (id , name , birth) values (1 , 'zhangsan' , str_to_date('01-10-1990' , '%d-%m-%Y')) ;
【注意】:如果输入的格式是 %Y-%m-%d , 则转换函数可以省略。
6、date_format 将date类型转换成具有一定格式的varchar字符串类型
【格式】:date_format(字段名 ,'日期格式')
【案例】:查询t_user表中的名字和生日
select name , date_format(birth , '%Y-%m') as birth from t_user ;
7、format 数字格式化
【格式】:format (数字 , ‘格式’);
mysql> select empno , ename , Format(sal , '$999,999') from emp ;
+-------+--------+--------------------------+
| empno | ename | Format(sal , '$999,999') |
+-------+--------+--------------------------+
| 7369 | SMITH | 800 |
| 7499 | ALLEN | 1,600 |
| 7521 | WARD | 1,250 |
| 7566 | JONES | 2,975 |
| 7654 | MARTIN | 1,250 |
| 7698 | BLAKE | 2,850 |
| 7782 | CLARK | 2,450 |
| 7788 | SCOTT | 3,000 |
| 7839 | KING | 5,000 |
| 7844 | TURNER | 1,500 |
| 7876 | ADAMS | 1,100 |
| 7900 | JAMES | 950 |
| 7902 | FORD | 3,000 |
| 7934 | MILLER | 1,300 |
+-------+--------+--------------------------+
14 rows in set, 14 warnings (0.06 sec)
8、round 四舍五入(可以有负数,负数表示相应的整数位数 ; 可以有小数,也是四舍五入保留位数 : 0.4 和 0.6 保留的位数就不一样)
【格式】: select round(值, 保留的小数位数) from 表名 ;
【案例】: 测试 1236.567 的四舍五入值
select round(1236.567 , 0) as result from emp ;
9、rand() 生成随机数 , 也会借助表的结构
【格式】: select rand() as result from emp ;
【案例】:生成 100 以内的 随机数
select round(rand() * 100) as result from emp ;
10、ifnull 可以将null转换成一个具体值
【注意】:在数据库之中,只要有null参与的数学运算 , 结果均为null
【格式】:ifnull(数据 , 被当做的值)
【案例】:将null 改为0 , 计算员工的年薪 , 并重命名为yearsal
select ename , (sal + ifnull(comm , 0)) * 12 as yearsal from emp ;
10、concat 字符串拼接
【案例】:将员工的姓名和员工的编号拼接起来
select concat(ename , empno) from emp ;
11、case.. when... then... when... then...else... end ....
【案例】:当员工的岗位是manager的时候,工资上调10% , 当工作岗位是salesman的时候,工资上调50% (注意:不修改数据库)
select ename , job , sal as oldsal ,(case job when 'manager' then sal*1.1 when 'salesman' then sal * 1.5 else sal end) as newsal from emp order by sal asc , ename desc ;
【案例】:将员工信息以首字母大写的形式展现出来
select concat(upper(substr(ename , 1 , 1)) , lower(substr(ename , 2 , length(ename) - 1)) ) as ename from emp ;
1.1.5 分组函数
-
概念:分组函数又被称为聚合函数、多行处理函数
-
特点:多个输入对应一个输出
函数名 函数功能 count 取得记录数 sum 求和 avg 取平均值 max 取最大的数 min 取最小的数 -
注意:
- 1、分组函数在使用的时候必须先进行分组,然后才能用;如果进行分组,整张表为一个组
- 2、分组函数会自动忽略null , 不需要提前进行处理
- 3、分组函数count(*)和count(字段)的区别
- count(具体字段) : 表示统计该字段下所有不为null的元素的总数
- count(*) : 只要有一行数据,count则++
- 4、分组函数不能够直接使用在where子句中
- 执行顺序:from、 where 、 group by、select 、 order by
- 因为执行where 语句的时候 尚未分组 ,所以会报错
- 5、所用的分组函数可以组合起来一起用
// 多行处理函数
1、count
【案例】:求出员工数量总和
select count(ename) from emp ;
2、sum
3、avg
4、max
5、min
【案例】:同时计算所有员工的工资总和、最高工资、最低工资、平均工资、总数
select sum(sal) , max(sal) , min(sal) , avg(sal) , count(sal) from emp ;
+----------+----------+----------+-------------+------------+
| sum(sal) | max(sal) | min(sal) | avg(sal) | count(sal) |
+----------+----------+----------+-------------+------------+
| 29025.00 | 5000.00 | 800.00 | 2073.214286 | 14 |
+----------+----------+----------+-------------+------------+
1.1.6 分组查询(重点)
- 概念:在实际的应用之中,可能有这样的需求,需要先进行分组,之后对每一个分组进行操作,这个时候就要用到分组查询
- 使用having子句 ,可以对分完组之后的数据进一步过滤 , 不能单独使用,要和group by一起使用 ,并且位置不能改变,不能代替where
- 格式: select 字段名 from 表名 group by …
- 格式 : select 字段名 from 表名 where 条件 group by … order by 排序 ;
【案例】:计算每个工作岗位的工资和
select job , sum(sal) from emp group by job ;
【案例】:计算每个工作的平均薪资
select job , avg(sal) from emp group by job ;
【案例】:计算每个部门的最高薪资
select deptno , max(sal) from emp group by deptno ;
[注意]:在一条select语句后面有 group by ,则在 select 后面只能跟分组的字段,以及分组函数
【案例】:找出每个部门,不同工作岗位的最高工资
select deptno , job , max(sal) from emp group by deptno , job order by deptno asc;
+--------+-----------+----------+
| deptno | job | max(sal) |
+--------+-----------+----------+
| 10 | CLERK | 1300.00 |
| 10 | MANAGER | 2450.00 |
| 10 | PRESIDENT | 5000.00 |
| 20 | ANALYST | 3000.00 |
| 20